dsh-run2skill 0.5.0-alpha.3 → 0.5.0-alpha.4

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.en.md CHANGED
@@ -1,169 +1,104 @@
1
- # dsh-run2skill
1
+ <p align="center">
2
+ <img src="docs/assets/run2skill-hero.png" alt="Run2Skill — Teach once. Reuse the skill." width="1000" />
3
+ </p>
2
4
 
3
- [中文](README.md) | English
5
+ <p align="center"><strong>Turn today's lessons into tomorrow's skills.</strong></p>
4
6
 
5
- Have you run into any of these situations?
7
+ <p align="center">
8
+ <a href="https://www.npmjs.com/package/dsh-run2skill"><img src="https://img.shields.io/npm/v/dsh-run2skill?color=247C78&amp;label=npm" alt="npm version" /></a>
9
+ <a href="docs/compatibility.md"><img src="https://img.shields.io/badge/DSH-0.2.0--rc.2-153B3C" alt="Supports DSH 0.2.0-rc.2" /></a>
10
+ <a href="https://github.com/qkycir-123/dsh-run2skill/actions/workflows/ci.yml"><img src="https://github.com/qkycir-123/dsh-run2skill/actions/workflows/ci.yml/badge.svg" alt="CI status" /></a>
11
+ <a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-EAB45C" alt="MIT license" /></a>
12
+ </p>
6
13
 
7
- - You teach an agent the same workflow today, then teach it again in a new session tomorrow.
8
- - You keep correcting the agent step by step: “Do not edit that file,” “write the test first,” or “this check is required.”
9
- - The agent finally learns the right approach, but the lesson disappears when the conversation ends.
14
+ <p align="center">
15
+ <a href="#install">Install</a> · <a href="#see-the-complete-flow">Full flow</a> · <a href="docs/compatibility.md">Compatibility</a> · <a href="CHANGELOG.md">Changelog</a> · <a href="README.md">中文</a>
16
+ </p>
10
17
 
11
- `dsh-run2skill` turns the corrections, constraints, and workflows you explicitly teach a DeepSeek Harness (DSH) agent into reviewable, reusable native Skills.
12
-
13
- > You teach once while doing real work. Run2Skill prepares a Skill draft from the reusable parts. Nothing is saved until you approve it.
14
-
15
- Run2Skill does not let an agent silently create permanent rules for itself. Every draft shows its source, intended scope, and complete content before you decide whether to save or discard it. Only an approved draft is written to DSH's native Skill directory.
16
-
17
- > npm's default `latest` and `next` tags both point to the preview [`0.5.0-alpha.3`](https://www.npmjs.com/package/dsh-run2skill/v/0.5.0-alpha.3), for Windows x64 Desktop and Web on DSH `0.2.0-rc.2`. For DSH Web `0.1.7-rc.2`, install `0.5.0-alpha.2`; for DSH Web `0.1.2-rc.1`, install the stable [`0.4.0`](https://www.npmjs.com/package/dsh-run2skill/v/0.4.0) release.
18
-
19
- `0.4.0` uses the Remote/API Gateway and browser-authentication contracts from DSH `0.1.2-rc.1`, and adapts its Session, Storage/Profile, Settings, and plugin-lifecycle changes. It supports only the retained built-in `standard` preset. Continue using `dsh-run2skill@0.3.1` with the older DSH `0.1.1-rc.2` line.
20
-
21
- Low-noise learning status, **Synthesize this experience now**, revision requests that generate a new draft, and bounded preservation of important long-workflow evidence remain available. An immediate request still waits for the agent to stop and for complete facts, then follows the existing lookup, review, and publication safety gates. Internal batch counters are not shown in the settings page.
18
+ Run2Skill turns the corrections, constraints, and workflows you teach an Agent in DeepSeek Harness (DSH) into reusable Skills. Review a draft, request changes, and approve it to save.
22
19
 
23
20
  ## See the complete flow
24
21
 
25
- ![Real DSH Web flow from a pending Run2Skill draft through human review to a successfully saved Skill](docs/assets/run2skill-demo.gif)
22
+ ![Run2Skill: open the plugin, review a draft, and save](docs/assets/run2skill-demo.gif)
23
+
24
+ *Main-branch interface · sample draft walkthrough*
26
25
 
27
- 1. **Find the draft** — Run2Skill only notifies you when action is required and places the draft under **Settings → Plugins → Run2Skill**.
28
- 2. **Review its evidence and scope** — inspect the rationale, filtered conversation evidence, target scope, and the complete `SKILL.md` that would be written.
29
- 3. **Request a revision if needed** — leave one short instruction and Run2Skill generates a new complete draft; the old version is not published and the new one still needs review.
30
- 4. **Save only after approval** — successful results appear under Recent activity and remain ordinary native DSH Skills.
26
+ 1. Open **Sidebar → Plugins → Run2Skill**.
27
+ 2. Review the draft’s purpose, scope, source conversation, and full content.
28
+ 3. Request changes or **approve and save**.
29
+ 4. Check **Recent activity**. The Skill is ready for a related task.
31
30
 
32
31
  <details>
33
- <summary>View the three key screenshots</summary>
32
+ <summary>View key screens</summary>
34
33
 
35
- ![A pending Skill draft in the Run2Skill settings page](docs/assets/01-proposal-inbox.png)
34
+ ![Draft inbox](docs/assets/01-proposal-inbox.png)
36
35
 
37
- ![Evidence, target scope, and review content for a Run2Skill Skill draft](docs/assets/02-review-details.png)
36
+ ![Draft sources and content](docs/assets/02-review-details.png)
38
37
 
39
- ![A successfully created native Skill shown in Run2Skill Recent activity](docs/assets/03-saved-activity.png)
38
+ ![Saved Skill and recent activity](docs/assets/03-saved-activity.png)
40
39
 
41
40
  </details>
42
41
 
43
42
  ## Install
44
43
 
45
- ### DSH Desktop / Web 0.2.0-rc.2
44
+ Supports DSH **0.2.0-rc.2** on Windows Desktop and Web.
46
45
 
47
- `0.5.0-alpha.3` has passed Windows Desktop compatibility checks. On Windows Desktop, use the dsh command provided by **Manage dsh Command…**. Launch Desktop once to initialize it, quit completely, then install the plugin:
46
+ **Desktop**: set up the command through **Manage dsh Command…** in the app. Complete the first launch, exit the app, and run:
48
47
 
49
48
  ```bash
50
- dsh plugin --profile desktop add dsh-run2skill@0.5.0-alpha.3
49
+ dsh plugin --profile desktop add dsh-run2skill
51
50
  ```
52
51
 
53
- Reopen Desktop and find dsh-run2skill in **Plugins**. The matching Web release uses `--profile web`. See [compatibility](docs/compatibility.md) for evidence and scope; macOS/Linux Desktop have not been validated.
54
-
55
- ### Web installation and older DSH versions
56
-
57
- Check your DSH Web version, install Node.js `^22.19.0 || >=24.0.0`, and make sure both `dsh` and `pnpm` are available. For DSH `0.2.0-rc.2`, install the current npm default:
58
-
59
- ```bash
60
- dsh plugin --profile web add dsh-run2skill
61
- ```
62
-
63
- For DSH `0.1.7-rc.2`, use the matching release:
64
-
65
- ```bash
66
- dsh plugin --profile web add dsh-run2skill@0.5.0-alpha.2
67
- ```
68
-
69
- For DSH `0.1.2-rc.1`, continue using the stable release:
52
+ **Web**: install Node.js `^22.19.0 || >=24.0.0` and make sure `pnpm` and `dsh` are available. Then run:
70
53
 
71
54
  ```bash
72
- dsh plugin --profile web add dsh-run2skill@0.4.0
55
+ dsh plugin --profile web add dsh-run2skill
73
56
  ```
74
57
 
75
- Restart DSH Web. Open **Settings → Plugins**; the plugin is loaded when the **Run2Skill** tab appears.
76
-
77
- Run2Skill does not need a separate model key. When it analyzes a Skill draft, it uses the model already selected for the current DSH session. If the session has no available model, learning stops and reports the reason instead of silently switching providers.
58
+ Restart DSH after installation. Run2Skill uses the model selected in the current session. See [Compatibility](docs/compatibility.md) for version details.
78
59
 
79
- ## Use it while you work
80
-
81
- Continue talking to DSH normally. For example:
82
-
83
- ```text
84
- Save this workflow as a Skill so it can be reused later.
85
- ```
60
+ ## Use
86
61
 
87
- You can also give an explicit correction, describe a durable constraint, or teach a reusable ordered workflow during ordinary work. You do not need to stop and manually reconstruct a `SKILL.md` file.
62
+ Work with your Agent as usual and describe the practices you want to reuse:
88
63
 
89
- After each conversation turn, Run2Skill records only low-cost observations; it does not call a model to review every turn. Batch detection runs at bounded batch boundaries, when the session becomes idle, or when you explicitly request saving or immediate synthesis. Only reusable experience proceeds to Skill lookup and draft generation.
64
+ - **Correction**: “Write a failing test before changing the implementation.”
65
+ - **Constraint**: “Use Chinese for GitHub copy in this project.”
66
+ - **Workflow**: “Check the upstream version, then run compatibility checks.”
67
+ - **Save request**: “Save this workflow as a Skill for reuse.”
90
68
 
91
- When something needs your attention, DSH shows one native notification. To review a draft:
69
+ Run2Skill organizes lessons when the session is idle or you request a save. DSH notifies you when a draft needs review. You can also open the plugin and choose **Organize this session now**.
92
70
 
93
- 1. Open **Settings → Plugins → Run2Skill**.
94
- 2. Review the draft, its intended scope, evidence, and complete content.
95
- 3. Approve and save it, request a revision, discard it, or retry a failed save.
96
- 4. After a successful save, it is an ordinary native DSH Skill and remains usable even if Run2Skill is later uninstalled.
71
+ Each draft includes its source conversation. Approve it, request changes, or discard it. Save Skills for the **current project** or **all projects**, using DSH’s default Skill directories.
97
72
 
98
- If a draft is not right, submit one revision request of at most 2,048 UTF-8 bytes. The Host uses the current complete draft to generate a new immutable version, records the parent/child relationship, and invalidates the old approval. You must inspect and approve the new version. This is not a free-form editor and does not bypass lookup, human review, or safe publication.
73
+ ## Settings
99
74
 
100
- Drafts can target the current project (`PROJECT`) or the current user (`USER`). The current release writes only to DSH's default Skill storage. If you replace or disable that storage, Run2Skill stops safely instead of guessing a path.
75
+ - **Automatic learning**: organize lessons from conversations automatically. When off, explicit “save as a Skill” requests still work.
76
+ - **Recent activity**: see Skills created or updated in the last seven days.
77
+ - **Clear all caches**: preview and clear pending drafts and intermediate data, keeping saved Skills, conversations, and DSH settings.
101
78
 
102
- ## What it learns
103
-
104
- Run2Skill focuses on reusable experience that you state explicitly:
105
-
106
- - **Correction:** “Do not fix the implementation first; write a failing test.”
107
- - **Durable constraint:** “All GitHub copy in this project must be written in Chinese.”
108
- - **Workflow:** “Check the upstream version, run compatibility probes, then update the evidence.”
109
- - **Explicit save request:** “Save this process as a Skill.”
110
-
111
- It does not turn every successful agent action into a permanent rule. It learns what you clearly taught, rather than trying to guess your intent.
112
-
113
- ## You remain in control
114
-
115
- You can turn **Automatic learning** off under **Settings → Plugins → Run2Skill**:
116
-
117
- - On: explicit corrections, durable constraints, and workflows may produce Skill drafts.
118
- - Off: ordinary automatic learning pauses, while an explicit “save this as a Skill” request still works.
119
-
120
- Run2Skill is local-first. It does not store model keys or copy the whole session. Only the necessary, filtered, truncated, and redacted context is sent to the session's selected model for analysis. Every Skill draft requires your approval before it is saved.
121
-
122
- The settings page also provides **Clear all cache**. It removes Run2Skill-owned intermediate cache, pending Skill drafts, failures, and non-sensitive diagnostics, but never removes:
123
-
124
- - original DSH session records;
125
- - already published native Skills;
126
- - provider, agent, or other DSH settings.
127
-
128
- See [Storage and upgrades](docs/storage-and-upgrades.md) for the detailed retention and migration rules.
79
+ Run2Skill manages drafts locally and sends selected, redacted conversation excerpts to the current model. See [Storage and upgrades](docs/storage-and-upgrades.md).
129
80
 
130
81
  ## Update and uninstall
131
82
 
132
- Install another explicit version:
83
+ Update, then restart DSH:
133
84
 
134
85
  ```bash
135
- dsh plugin --profile web add dsh-run2skill@<version>
86
+ dsh plugin --profile desktop add dsh-run2skill
136
87
  ```
137
88
 
138
89
  Uninstall:
139
90
 
140
91
  ```bash
141
- dsh plugin --profile web remove dsh-run2skill
92
+ dsh plugin --profile desktop remove dsh-run2skill
142
93
  ```
143
94
 
144
- Restart DSH Web after either command. Uninstalling does not delete published Skills and keeps Run2Skill data by default. Use **Clear all cache** on the settings page before uninstalling if you want to remove that data.
145
-
146
- ## Troubleshooting
147
-
148
- - **The Run2Skill tab is missing:** confirm that you use the DSH `web` profile and restarted DSH Web after installation.
149
- - **“Run2Skill is currently limited” (`DEGRADED`):** do not manually delete storage files. Retry, then report the issue if the state persists.
150
- - **“This Run2Skill version is incompatible” (`INCOMPATIBLE`):** verify your DSH version and restore a compatible Run2Skill version.
151
- - **No Skill draft appears:** confirm that the current session has an available model, or say “Save this workflow as a Skill.”
152
- - **A `PROJECT` draft cannot be saved:** the current session must belong to a project workspace recognized by DSH.
153
- - **You changed DSH Skill storage:** the current release supports only the default storage and stops safely instead of guessing where to write.
154
-
155
- Report problems through [GitHub Issues](https://github.com/qkycir-123/dsh-run2skill/issues). Do not attach keys, complete sessions, private paths, or logs containing sensitive information.
95
+ For Web, replace `desktop` with `web`. Saved Skills and plugin data remain after uninstalling. To clear caches, use the plugin’s cleanup action before uninstalling.
156
96
 
157
- ## Learn more
97
+ ## Help and contribute
158
98
 
159
- - [Changelog](CHANGELOG.md)
160
- - [DSH compatibility](docs/compatibility.md)
161
- - [Storage and upgrades](docs/storage-and-upgrades.md)
162
- - [Product requirements](docs/product/prd.md)
163
- - [Architecture baseline](docs/architecture/baseline.md)
164
- - [Design document index](docs/design/README.md)
165
- - [Single-owner design for one Skill-save intent](docs/design/single-owner-skill-save.md)
166
- - [Contributing](CONTRIBUTING.md)
167
- - [Maintainer compatibility probes](probes/README.md)
99
+ - [Report an issue](https://github.com/qkycir-123/dsh-run2skill/issues)
100
+ - [Compatibility](docs/compatibility.md) · [Changelog](CHANGELOG.md)
101
+ - [Contributing](CONTRIBUTING.md) · [Maintainer probes](probes/README.md)
102
+ - [Product requirements](docs/product/prd.md) · [Architecture and design](docs/architecture/baseline.md)
168
103
 
169
- This project is licensed under the [MIT License](LICENSE). Licenses for dependencies embedded in the client bundle are listed in [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md).
104
+ [MIT License](LICENSE) · [Third-party licenses](THIRD_PARTY_NOTICES.md)
package/README.md CHANGED
@@ -1,173 +1,104 @@
1
- # dsh-run2skill
1
+ <p align="center">
2
+ <img src="docs/assets/run2skill-hero.png" alt="Run2Skill — Teach once. Reuse the skill." width="1000" />
3
+ </p>
2
4
 
3
- 中文 | [English](README.en.md)
5
+ <p align="center"><strong>把对话经验,变成下次可用的 Skill。</strong></p>
4
6
 
5
- 你是否遇到过这些场景?
7
+ <p align="center">
8
+ <a href="https://www.npmjs.com/package/dsh-run2skill"><img src="https://img.shields.io/npm/v/dsh-run2skill?color=247C78&amp;label=npm" alt="npm 版本" /></a>
9
+ <a href="docs/compatibility.md"><img src="https://img.shields.io/badge/DSH-0.2.0--rc.2-153B3C" alt="支持 DSH 0.2.0-rc.2" /></a>
10
+ <a href="https://github.com/qkycir-123/dsh-run2skill/actions/workflows/ci.yml"><img src="https://github.com/qkycir-123/dsh-run2skill/actions/workflows/ci.yml/badge.svg" alt="CI 状态" /></a>
11
+ <a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-EAB45C" alt="MIT 许可证" /></a>
12
+ </p>
6
13
 
7
- - 同一套工作流,今天教 Agent 一遍,明天换个 Session 又教一遍;
8
- - Agent 每走一步都需要你纠正:“别改那个文件”“先跑测试”“这个步骤不能省”;
9
- - 终于把 Agent 教会了,对话一结束,经验也跟着下班了。
14
+ <p align="center">
15
+ <a href="#安装">安装</a> · <a href="#看一遍完整流程">完整流程</a> · <a href="docs/compatibility.md">兼容性</a> · <a href="CHANGELOG.md">更新记录</a> · <a href="README.en.md">English</a>
16
+ </p>
10
17
 
11
- 如果你已经受够了在对话框里重复当师傅,`dsh-run2skill` 就是来做这件事的:
12
-
13
- > 把你在 DeepSeek Harness(DSH)里明确教给 Agent 的纠正、约束和工作流,整理成可审核、可复用的原生 Skill。
14
-
15
- 一句话说:**你负责在真实工作里教一次,run2skill 负责把值得复用的部分整理成技能草稿;你点头,它才落盘。**
16
-
17
- 它不会让 Agent 偷偷给自己立规矩。每份技能草稿都可以先看来源、适用范围和完整内容,然后由你决定确认保存还是放弃草稿。只有确认后,它才会写入 DSH 的原生 Skill 目录。
18
-
19
- > npm 默认 `latest` 与 `next` 均指向预发布版 [`0.5.0-alpha.3`](https://www.npmjs.com/package/dsh-run2skill/v/0.5.0-alpha.3),支持 DSH `0.2.0-rc.2` 的 Windows x64 Desktop 和同版本 Web。DSH Web `0.1.7-rc.2` 请安装 `0.5.0-alpha.2`;DSH Web `0.1.2-rc.1` 请安装稳定版 [`0.4.0`](https://www.npmjs.com/package/dsh-run2skill/v/0.4.0)。
20
-
21
- `0.4.0` 改用 DSH `0.1.2-rc.1` 的 Remote/API Gateway 与浏览器认证契约,并适配 Session、Storage/Profile、Settings 和插件生命周期变化。它只支持 RC1 保留的内置 `standard` preset;使用旧 DSH `0.1.1-rc.2` 时请继续安装 `dsh-run2skill@0.3.1`。
22
-
23
- 低噪声整理状态、“立即整理本次经验”、按意见生成新版草稿,以及长工作流关键证据保留继续保留。“立即整理”仍会等待 Agent 停止运行和事实完整,并继续经过查重、审核与发布安全门;设置页不会展示内部批次计数。
18
+ Run2Skill 把你在 DeepSeek Harness(DSH)里教给 Agent 的纠正、约束和工作流,整理成可复用的 Skill。你查看草稿、提出修改意见,确认后保存。
24
19
 
25
20
  ## 看一遍完整流程
26
21
 
27
- ![Run2Skill 从待审核技能草稿、人工核对到成功沉淀的真实 DSH Web 流程](docs/assets/run2skill-demo.gif)
22
+ ![Run2Skill:打开插件、审核草稿、确认保存](docs/assets/run2skill-demo.gif)
28
23
 
29
- 1. **发现技能草稿**:Run2Skill 只在有事项需要处理时提醒你,并把草稿放在 **设置 → 插件 → Run2Skill**。
30
- 2. **核对来源与范围**:查看生成理由、经过过滤的对话证据、保存范围以及将要写入的完整 `SKILL.md`。
31
- 3. **不满意就要求修改**:写一条简短意见,Run2Skill 会生成新的完整草稿;旧版本不会直接发布,新版本仍需你审核。
32
- 4. **确认后才保存**:成功结果会进入“最近活动”;保存下来的内容是普通的 DSH 原生 Skill。
24
+ *main 分支界面 · 示例草稿演示*
25
+
26
+ 1. 打开 **左侧栏 → 插件 → Run2Skill**。
27
+ 2. 查看草稿的用途、适用范围、对话来源和完整内容。
28
+ 3. 按需提出修改意见,或直接**确认并保存**。
29
+ 4. 在**最近活动**中查看结果,下次相关任务即可使用这个 Skill。
33
30
 
34
31
  <details>
35
- <summary>查看三张关键界面截图</summary>
32
+ <summary>查看关键界面</summary>
36
33
 
37
- ![Run2Skill 设置页中的待审核技能草稿](docs/assets/01-proposal-inbox.png)
34
+ ![待审核草稿](docs/assets/01-proposal-inbox.png)
38
35
 
39
- ![Run2Skill 技能草稿的来源、保存范围与审核内容](docs/assets/02-review-details.png)
36
+ ![草稿来源与内容](docs/assets/02-review-details.png)
40
37
 
41
- ![Run2Skill 最近活动中显示已经成功创建的原生 Skill](docs/assets/03-saved-activity.png)
38
+ ![保存结果与最近活动](docs/assets/03-saved-activity.png)
42
39
 
43
40
  </details>
44
41
 
45
42
  ## 安装
46
43
 
47
- ### DSH Desktop / Web 0.2.0-rc.2
44
+ 适用于 DSH **0.2.0-rc.2** 的 Windows Desktop 和 Web。
48
45
 
49
- `0.5.0-alpha.3` 已完成 Windows 桌面兼容验收。Windows Desktop 使用应用 **Manage dsh Command…** 提供的 dsh 命令。首次启动初始化后完全退出,再安装插件:
46
+ **Desktop**:在应用中通过 **Manage dsh Command…** 配置命令,完成首次启动后退出应用,再运行:
50
47
 
51
48
  ```bash
52
- dsh plugin --profile desktop add dsh-run2skill@0.5.0-alpha.3
49
+ dsh plugin --profile desktop add dsh-run2skill
53
50
  ```
54
51
 
55
- 重新打开桌面版,在 **插件** 页面查看 dsh-run2skill。同版本 Web 使用 `--profile web`。运行边界和证据见 [兼容性](docs/compatibility.md);macOS/Linux Desktop 尚未验收。
56
-
57
- ### Web 安装与旧版 DSH
58
-
59
- 先确认你使用的 DSH Web 版本,已经安装 Node.js `^22.19.0 || >=24.0.0`,并能在终端运行 `dsh` 和 `pnpm`。DSH `0.2.0-rc.2` 安装当前 npm 默认版本:
60
-
61
- ```bash
62
- dsh plugin --profile web add dsh-run2skill
63
- ```
64
-
65
- DSH `0.1.7-rc.2` 使用对应版本:
66
-
67
- ```bash
68
- dsh plugin --profile web add dsh-run2skill@0.5.0-alpha.2
69
- ```
70
-
71
- DSH `0.1.2-rc.1` 继续安装稳定版:
52
+ **Web**:准备好 Node.js `^22.19.0 || >=24.0.0`、`pnpm` 和 `dsh` 命令,再运行:
72
53
 
73
54
  ```bash
74
- dsh plugin --profile web add dsh-run2skill@0.4.0
55
+ dsh plugin --profile web add dsh-run2skill
75
56
  ```
76
57
 
77
- 重启 DSH Web。打开 **Settings → Plugins**,看到 **run2skill** 卡片就说明插件已加载。
78
-
79
- run2skill 不需要单独填写模型密钥。需要分析技能草稿时,它沿用当前 DSH 会话已经选择的模型;如果当前会话没有可用模型,学习会停止并显示原因,不会偷偷换用其他模型。
58
+ 安装后重启 DSH。Run2Skill 使用当前会话选择的模型。版本信息见 [兼容性](docs/compatibility.md)。
80
59
 
81
- ## 用法:你继续干活,它负责记笔记
82
-
83
- 平时照常和 DSH 对话即可。例如:
84
-
85
- ```text
86
- 把这个流程保存成 Skill,以后可以复用。
87
- ```
60
+ ## 使用
88
61
 
89
- 你也可以在正常工作中明确纠正做法、说明长期约束,或给出有顺序的可复用流程。不用为了“教它”停下当前任务,也不用自己打开 `SKILL.md` 边回忆边编辑。
62
+ 照常与 Agent 工作,把值得复用的做法说清楚:
90
63
 
91
- run2skill 会在每轮对话完成后只做低成本记录,不会每轮调用模型复盘。到达有界批次边界、会话进入空闲,或你明确请求保存/立即整理时,才会触发一次批次检测;只有检测到可复用经验,才继续查重和技能草稿生成。
64
+ - **纠正**:“先写失败测试,再修实现。”
65
+ - **约束**:“这个项目的 GitHub 文案统一用中文。”
66
+ - **工作流**:“先核对上游版本,再运行兼容性检查。”
67
+ - **保存请求**:“把这个流程保存成 Skill,以后复用。”
92
68
 
93
- 当有需要你处理的事项时,DSH 会显示一条原生通知;平时页面顶部不会常驻 run2skill 状态框。处理技能草稿时:
69
+ Run2Skill 在会话空闲或收到保存请求时整理经验。有草稿需要审核时,DSH 会通知你。也可以打开插件页,点击**立即整理本次经验**。
94
70
 
95
- 1. 打开 **Settings → Plugins → run2skill**。
96
- 2. 在待处理列表中查看技能草稿、适用范围和内容差异。
97
- 3. 选择确认并保存、要求修改、放弃草稿,或在保存失败后重试。
98
- 4. 保存成功后,结果就是普通的 DSH 原生 Skill;即使以后卸载 run2skill,它仍然可以被 DSH 使用。
71
+ 每份草稿都附有对话来源。你可以确认保存、要求修改,或放弃草稿。Skill 支持保存到**当前项目**或**所有项目**,使用 DSH 默认的 Skill 目录。
99
72
 
100
- 如果草稿不合适,可以先写一条不超过 2048 UTF-8 字节的修改意见。Host 会基于当前完整草稿生成新的不可变版本,保留父子版本关系并让旧批准失效;你必须重新查看并确认新版本。这个入口不是自由编辑器,也不会绕过查重、人工审核或安全发布。
73
+ ## 设置
101
74
 
102
- 技能草稿可以保存到当前项目(`PROJECT`)或当前用户(`USER`)范围。当前版本只会写入 DSH 默认的 Skill 存储目录;如果你改过 Skill 的存储方式或关闭了默认目录,run2skill 会停止保存,不会猜测写入位置。
75
+ - **自动学习**:自动从对话中整理经验;关闭后仍可明确请求“保存为 Skill”。
76
+ - **最近活动**:查看最近 7 天新建或更新的 Skill。
77
+ - **清理所有缓存**:预览并清理待处理草稿与中间缓存,保留已保存的 Skill、会话记录和 DSH 设置。
103
78
 
104
- ## 它会学什么
105
-
106
- run2skill 目前专注于你**明确表达**的可复用经验:
107
-
108
- - **纠正**:“不要直接修实现,先写失败测试。”
109
- - **长期约束**:“这个项目的所有 GitHub 文案都使用中文。”
110
- - **工作流**:“先核对上游版本,再跑兼容性探针,最后更新证据。”
111
- - **显式保存请求**:“把这个流程保存成 Skill。”
112
-
113
- 它不会因为 Agent 偶尔成功一次,就自作主张地把所有操作写成永久规则。它学的是你明确教过的东西,不是猜你的心思。
114
-
115
- ## 你仍然握着方向盘
116
-
117
- 在 **Settings → Plugins → run2skill** 中可以关闭**自动学习**:
118
-
119
- - 开启:明确的纠正、长期约束和工作流可以生成技能草稿。
120
- - 关闭:暂停普通自动学习;你明确说“保存为 Skill”时仍然可以生成技能草稿。
121
-
122
- run2skill 是本地优先插件。它不会保存模型密钥,也不会复制完整会话;送去模型分析的只是经过筛选、截断和敏感信息清理的必要内容。技能草稿保存前始终需要你确认。
123
-
124
- 换句话说:run2skill 可以帮你整理经验,但不会替你签字。
125
-
126
- 设置页也提供**清理所有缓存**功能。它会删除 Run2Skill 自己产生的中间缓存、待处理技能草稿、失败与非敏感诊断记录,但不会删除:
127
-
128
- - DSH 的原始会话记录;
129
- - 已发布的原生 Skill;
130
- - Provider、Agent 或其他 DSH 设置。
131
-
132
- 更详细的保留与升级规则见 [数据存储与升级](docs/storage-and-upgrades.md)。
79
+ Run2Skill 在本地管理草稿,并将经过筛选和脱敏的必要对话片段交给当前模型分析。详见 [数据存储与升级](docs/storage-and-upgrades.md)。
133
80
 
134
81
  ## 更新与卸载
135
82
 
136
- 更新到另一个明确版本:
83
+ 更新后重启 DSH:
137
84
 
138
85
  ```bash
139
- dsh plugin --profile web add dsh-run2skill@<version>
86
+ dsh plugin --profile desktop add dsh-run2skill
140
87
  ```
141
88
 
142
89
  卸载:
143
90
 
144
91
  ```bash
145
- dsh plugin --profile web remove dsh-run2skill
92
+ dsh plugin --profile desktop remove dsh-run2skill
146
93
  ```
147
94
 
148
- 两种操作后都请重启 DSH Web。卸载不会删除已经发布的 Skill,也默认保留 run2skill 的数据;如果你希望清除这些数据,请在卸载前先使用设置页中的**清理所有缓存**。
149
-
150
- ## 遇到问题
151
-
152
- - **看不到 run2skill 卡片**:确认使用的是 DSH `web` profile,并在安装后重启了 DSH Web。
153
- - **提示“run2skill 当前功能受限”**(内部状态码:`DEGRADED`):不要手工删除存储文件;重试后仍无法恢复时,可在 GitHub Issues 报告。
154
- - **提示“run2skill 当前版本不兼容”**(内部状态码:`INCOMPATIBLE`):确认 DSH 是否为受支持版本,再恢复与它兼容的 run2skill 版本。
155
- - **没有生成技能草稿**:确认当前会话有可用模型;也可以直接说“把这个流程保存成 Skill”。
156
- - **无法保存到当前项目**(`PROJECT`):当前会话必须位于 DSH 能识别的项目工作区。
157
- - **改过 Skill 的存储目录或存储方式**:当前版本只支持 DSH 默认设置,会选择安全停止,不会猜测写入位置。
158
-
159
- 欢迎在 [GitHub Issues](https://github.com/qkycir-123/dsh-run2skill/issues) 报告问题。请不要附上密钥、完整 Session、私人路径或包含敏感信息的日志。
95
+ Web 用户将 `desktop` 换成 `web`。卸载后已保存的 Skill 和插件数据继续保留;需要清理缓存时,可在卸载前使用插件页的清理功能。
160
96
 
161
- ## 进一步了解
97
+ ## 帮助与贡献
162
98
 
163
- - [版本变化](CHANGELOG.md)
164
- - [DSH 兼容性](docs/compatibility.md)
165
- - [数据存储与升级](docs/storage-and-upgrades.md)
166
- - [产品需求](docs/product/prd.md)
167
- - [架构基线](docs/architecture/baseline.md)
168
- - [设计文档索引](docs/design/README.md)
169
- - [同一 Skill 保存意图的单一生成所有者设计](docs/design/single-owner-skill-save.md)
170
- - [贡献指南](CONTRIBUTING.md)
171
- - [维护者兼容性探针](probes/README.md)
99
+ - [报告问题](https://github.com/qkycir-123/dsh-run2skill/issues)
100
+ - [兼容性](docs/compatibility.md) · [更新记录](CHANGELOG.md)
101
+ - [贡献指南](CONTRIBUTING.md) · [维护者探针](probes/README.md)
102
+ - [产品需求](docs/product/prd.md) · [架构与设计](docs/architecture/baseline.md)
172
103
 
173
- 本项目采用 [MIT License](LICENSE)。Client bundle 内嵌依赖的许可声明见 [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md)。
104
+ [MIT License](LICENSE) · [第三方许可](THIRD_PARTY_NOTICES.md)
Binary file
package/lib/client.js CHANGED
@@ -5643,51 +5643,50 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5643
5643
  }
5644
5644
  //#endregion
5645
5645
  //#region \0run2skill-css:run2skill-settings-page.module.css.mjs
5646
- const css = ".run2skill_page_OghXMq{width:min(100%,960px);min-width:0;color:var(--dsw-alias-label-primary);gap:14px;padding:8px 0 32px;font-size:14px;line-height:1.6;display:grid}.run2skill_intro_OghXMq,.run2skill_muted_OghXMq{color:var(--dsw-alias-label-secondary);margin:0;font-size:13px;line-height:1.6}.run2skill_section_OghXMq{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);border-radius:12px;overflow:hidden}.run2skill_sectionHeader_OghXMq{box-sizing:border-box;height:auto;min-height:52px;padding:12px 16px}.run2skill_sectionTitle_OghXMq{font-size:14px;font-weight:600}.run2skill_sectionBody_OghXMq{gap:14px;min-width:0;padding:4px 18px 18px;display:grid;container-type:inline-size}.run2skill_sectionBody_OghXMq h3{margin:0 0 8px;font-size:14px;line-height:1.5}.run2skill_sectionBody_OghXMq p{line-height:1.6}.run2skill_publicationFeedback_OghXMq{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);border-radius:12px;gap:8px;padding:14px 16px;font-size:13px;display:grid}.run2skill_publicationFeedback_OghXMq p{margin:0}.run2skill_publicationFeedback_OghXMq>:last-child{justify-self:start}.run2skill_attentionGroup_OghXMq{gap:16px;min-width:0;display:grid}.run2skill_empty_OghXMq{min-height:56px;color:var(--dsw-alias-label-secondary);place-items:center;margin:0;font-size:13px;display:grid}.run2skill_toolbar_OghXMq,.run2skill_actions_OghXMq,.run2skill_modeGroup_OghXMq{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.run2skill_learningStatusRow_OghXMq{justify-content:space-between;align-items:center;gap:16px;min-width:0;display:flex}.run2skill_learningStatusRow_OghXMq>:first-child{overflow-wrap:anywhere;min-width:0}@container (width<=30rem){.run2skill_learningStatusRow_OghXMq{flex-direction:column;align-items:stretch}.run2skill_learningStatusRow_OghXMq .run2skill_actions_OghXMq{flex-direction:column;align-items:stretch;width:100%}.run2skill_learningStatusRow_OghXMq .run2skill_actions_OghXMq>*{box-sizing:border-box;white-space:normal;overflow-wrap:anywhere;flex:none;width:100%;min-width:0;max-width:100%;height:auto;min-height:36px}}.run2skill_attentionList_OghXMq,.run2skill_proposalList_OghXMq,.run2skill_activityList_OghXMq{gap:8px;margin:0;padding:0;list-style:none;display:grid}.run2skill_activityItem_OghXMq{background:var(--dsw-alias-bg-layer-2);border-radius:8px;justify-content:space-between;align-items:center;gap:12px;padding:10px 12px;display:flex}.run2skill_activitySummary_OghXMq{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.run2skill_proposalToolbar_OghXMq{grid-template-columns:minmax(12rem,1fr) auto;align-items:center;gap:8px;display:grid}.run2skill_proposalToolbar_OghXMq>:first-child{width:100%}.run2skill_proposalToolbarCompact_OghXMq{justify-content:flex-end;display:flex}.run2skill_proposalToolbarCompact_OghXMq>:first-child{width:auto}.run2skill_proposalLayout_OghXMq{grid-template-columns:1fr;gap:16px;display:grid}.run2skill_proposalListButton_OghXMq{text-align:start;white-space:normal;overflow-wrap:anywhere;border-radius:8px;flex-direction:column;justify-content:flex-start;align-items:flex-start;gap:4px;width:100%;height:auto;min-height:48px;padding:12px 14px}.run2skill_proposalListButton_OghXMq[aria-current=true]{border-color:var(--dsw-alias-brand-primary);background:var(--dsw-alias-interactive-bg-active);color:var(--dsw-alias-label-primary);box-shadow:inset 2px 0 var(--dsw-alias-brand-primary)}.run2skill_proposalName_OghXMq{max-width:100%;font-size:14px;font-weight:600;line-height:20px}.run2skill_proposalMeta_OghXMq{max-width:100%;color:var(--dsw-alias-label-secondary);font-size:12px;line-height:18px}.run2skill_detail_OghXMq{border-top:1px solid var(--dsw-alias-border-l2);min-width:0;padding:16px 0 0}.run2skill_detail_OghXMq>:first-child{margin-top:0}.run2skill_detail_OghXMq h3,.run2skill_legacyDetail_OghXMq h3{overflow-wrap:anywhere;margin:0 0 16px;font-size:16px;font-weight:600;line-height:1.5}.run2skill_detail_OghXMq h4,.run2skill_legacyDetail_OghXMq h4{margin:22px 0 8px;font-size:13px;font-weight:600;line-height:1.5}.run2skill_detail_OghXMq p{margin:8px 0}.run2skill_detail_OghXMq>article{border-left:2px solid var(--dsw-alias-border-l2);margin:12px 0;padding-left:12px}.run2skill_detail_OghXMq>article strong{font-size:13px;font-weight:500}.run2skill_detailFacts_OghXMq{grid-template-columns:minmax(6rem,max-content) minmax(0,1fr);gap:8px 14px;margin:0 0 16px;display:grid}.run2skill_detailFacts_OghXMq dt{color:var(--dsw-alias-label-secondary);font-size:13px}.run2skill_detailFacts_OghXMq dd{overflow-wrap:anywhere;min-width:0;margin:0;font-size:14px}.run2skill_detail_OghXMq pre{white-space:pre-wrap;unicode-bidi:isolate;overflow:auto}.run2skill_technicalDetails_OghXMq{background:var(--dsw-alias-bg-layer-2);border-radius:8px;margin:16px 0;padding:10px 12px}.run2skill_technicalDetails_OghXMq summary{cursor:pointer;color:var(--dsw-alias-label-secondary);font-size:13px}.run2skill_technicalDetails_OghXMq[open] summary{margin-bottom:12px}.run2skill_status_OghXMq{min-height:20px;margin:0;font-size:13px}.run2skill_revisionBox_OghXMq{background:var(--dsw-alias-bg-layer-2);border-radius:10px;gap:8px;margin:18px 0;padding:14px;display:grid}.run2skill_revisionBox_OghXMq label{font-size:14px;font-weight:600}.run2skill_revisionBox_OghXMq textarea{box-sizing:border-box;resize:vertical;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);width:100%;min-height:84px;color:var(--dsw-alias-label-primary);font:inherit;border-radius:10px;padding:10px 12px;line-height:1.5}.run2skill_revisionBox_OghXMq textarea:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:2px}.run2skill_revisionBox_OghXMq textarea:disabled{cursor:not-allowed;opacity:.65}.run2skill_revisionBox_OghXMq>:last-child{justify-self:start}.run2skill_danger_OghXMq{color:var(--dsw-alias-state-error-primary)}.run2skill_backdrop_OghXMq,.run2skill_rejectOverlay_OghXMq{background:var(--dsw-alias-bg-mask-1);position:fixed;inset:0}.run2skill_backdrop_OghXMq{z-index:999}.run2skill_rejectOverlay_OghXMq{z-index:1001;place-items:center;padding:16px;display:grid}.run2skill_legacyDialog_OghXMq{z-index:1000;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary);box-shadow:0 16px 48px var(--dsw-alias-bg-mask-1);border-radius:16px;grid-template-columns:minmax(16rem,24rem) minmax(0,1fr);gap:16px;padding:16px;display:grid;position:fixed;inset:5vh 5vw;overflow:hidden}.run2skill_blocked_OghXMq{pointer-events:none;display:contents}.run2skill_queue_OghXMq,.run2skill_legacyDetail_OghXMq{min-width:0;overflow:auto}.run2skill_legacyHeader_OghXMq{justify-content:space-between;align-items:center;gap:8px;display:flex}.run2skill_legacyList_OghXMq{margin:0;padding:0;list-style:none}.run2skill_rejectCard_OghXMq{background:var(--dsw-alias-bg-layer-1);border-radius:16px;max-width:32rem;padding:16px}.run2skill_textBlock_OghXMq{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);max-width:100%;font-family:var(--ds-font-family-code);white-space:pre-wrap;overflow-wrap:anywhere;unicode-bidi:isolate;border-radius:8px;padding:14px;font-size:12px;line-height:1.75;overflow:auto}.run2skill_previewFacts_OghXMq{grid-template-columns:max-content 1fr;gap:6px 12px;display:grid}.run2skill_previewFacts_OghXMq dt,.run2skill_previewFacts_OghXMq dd{margin:0}@container (width>=760px){.run2skill_proposalLayout_OghXMq{grid-template-columns:minmax(200px,.8fr) minmax(0,1.8fr);gap:20px}.run2skill_proposalLayout_OghXMq .run2skill_detail_OghXMq{border-top:0;border-left:1px solid var(--dsw-alias-border-l2);padding:0 0 0 20px}}@container (width<=420px){.run2skill_proposalToolbar_OghXMq,.run2skill_detailFacts_OghXMq{grid-template-columns:1fr}.run2skill_proposalToolbar_OghXMq>:last-child{justify-self:start}.run2skill_detailFacts_OghXMq dt:not(:first-child){margin-top:8px}}@media (width<=720px){.run2skill_sectionBody_OghXMq{padding:8px 18px 20px}.run2skill_activityItem_OghXMq{flex-direction:column;align-items:flex-start}}";
5646
+ const css = ".run2skill_page_OghXMq{width:min(100%,960px);min-width:0;color:var(--dsw-alias-label-primary);gap:14px;padding:8px 0 32px;font-size:14px;line-height:1.6;display:grid}.run2skill_muted_OghXMq{color:var(--dsw-alias-label-secondary);margin:0;font-size:13px;line-height:1.6}.run2skill_section_OghXMq{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);border-radius:12px;overflow:hidden}.run2skill_sectionHeader_OghXMq{box-sizing:border-box;height:auto;min-height:52px;padding:12px 16px}.run2skill_sectionTitle_OghXMq{font-size:14px;font-weight:600}.run2skill_sectionBody_OghXMq{gap:14px;min-width:0;padding:4px 18px 18px;display:grid;container-type:inline-size}.run2skill_sectionBody_OghXMq h3{margin:0 0 8px;font-size:14px;line-height:1.5}.run2skill_sectionBody_OghXMq p{line-height:1.6}.run2skill_publicationFeedback_OghXMq{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);border-radius:12px;gap:8px;padding:14px 16px;font-size:13px;display:grid}.run2skill_publicationFeedback_OghXMq p{margin:0}.run2skill_publicationFeedback_OghXMq>:last-child{justify-self:start}.run2skill_attentionGroup_OghXMq{gap:16px;min-width:0;display:grid}.run2skill_empty_OghXMq{min-height:56px;color:var(--dsw-alias-label-secondary);place-items:center;margin:0;font-size:13px;display:grid}.run2skill_toolbar_OghXMq,.run2skill_actions_OghXMq,.run2skill_modeGroup_OghXMq{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.run2skill_learningStatusRow_OghXMq{justify-content:space-between;align-items:center;gap:16px;min-width:0;display:flex}.run2skill_learningStatusRow_OghXMq>:first-child{overflow-wrap:anywhere;min-width:0}@container (width<=30rem){.run2skill_learningStatusRow_OghXMq{flex-direction:column;align-items:stretch}.run2skill_learningStatusRow_OghXMq .run2skill_actions_OghXMq{flex-direction:column;align-items:stretch;width:100%}.run2skill_learningStatusRow_OghXMq .run2skill_actions_OghXMq>*{box-sizing:border-box;white-space:normal;overflow-wrap:anywhere;flex:none;width:100%;min-width:0;max-width:100%;height:auto;min-height:36px}}.run2skill_attentionList_OghXMq,.run2skill_proposalList_OghXMq,.run2skill_activityList_OghXMq{gap:8px;margin:0;padding:0;list-style:none;display:grid}.run2skill_activityItem_OghXMq{background:var(--dsw-alias-bg-layer-2);border-radius:8px;justify-content:space-between;align-items:center;gap:12px;padding:10px 12px;display:flex}.run2skill_activitySummary_OghXMq{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.run2skill_proposalToolbar_OghXMq{grid-template-columns:minmax(12rem,1fr) auto;align-items:center;gap:8px;display:grid}.run2skill_proposalToolbar_OghXMq>:first-child{width:100%}.run2skill_proposalToolbarCompact_OghXMq{justify-content:flex-end;display:flex}.run2skill_proposalToolbarCompact_OghXMq>:first-child{width:auto}.run2skill_proposalLayout_OghXMq{grid-template-columns:1fr;gap:16px;display:grid}.run2skill_proposalListButton_OghXMq{text-align:start;white-space:normal;overflow-wrap:anywhere;border-radius:8px;flex-direction:column;justify-content:flex-start;align-items:flex-start;gap:4px;width:100%;height:auto;min-height:48px;padding:12px 14px}.run2skill_proposalListButton_OghXMq[aria-current=true]{border-color:var(--dsw-alias-brand-primary);background:var(--dsw-alias-interactive-bg-active);color:var(--dsw-alias-label-primary);box-shadow:inset 2px 0 var(--dsw-alias-brand-primary)}.run2skill_proposalName_OghXMq{max-width:100%;font-size:14px;font-weight:600;line-height:20px}.run2skill_proposalMeta_OghXMq{max-width:100%;color:var(--dsw-alias-label-secondary);font-size:12px;line-height:18px}.run2skill_detail_OghXMq{border-top:1px solid var(--dsw-alias-border-l2);min-width:0;padding:16px 0 0}.run2skill_detail_OghXMq>:first-child{margin-top:0}.run2skill_detail_OghXMq h3,.run2skill_legacyDetail_OghXMq h3{overflow-wrap:anywhere;margin:0 0 16px;font-size:16px;font-weight:600;line-height:1.5}.run2skill_detail_OghXMq h4,.run2skill_legacyDetail_OghXMq h4{margin:22px 0 8px;font-size:13px;font-weight:600;line-height:1.5}.run2skill_detail_OghXMq p{margin:8px 0}.run2skill_detail_OghXMq>article{border-left:2px solid var(--dsw-alias-border-l2);margin:12px 0;padding-left:12px}.run2skill_detail_OghXMq>article strong{font-size:13px;font-weight:500}.run2skill_detailFacts_OghXMq{grid-template-columns:minmax(6rem,max-content) minmax(0,1fr);gap:8px 14px;margin:0 0 16px;display:grid}.run2skill_detailFacts_OghXMq dt{color:var(--dsw-alias-label-secondary);font-size:13px}.run2skill_detailFacts_OghXMq dd{overflow-wrap:anywhere;min-width:0;margin:0;font-size:14px}.run2skill_detail_OghXMq pre{white-space:pre-wrap;unicode-bidi:isolate;overflow:auto}.run2skill_technicalDetails_OghXMq{background:var(--dsw-alias-bg-layer-2);border-radius:8px;margin:16px 0;padding:10px 12px}.run2skill_technicalDetails_OghXMq summary{cursor:pointer;color:var(--dsw-alias-label-secondary);font-size:13px}.run2skill_technicalDetails_OghXMq[open] summary{margin-bottom:12px}.run2skill_status_OghXMq{min-height:20px;margin:0;font-size:13px}.run2skill_revisionBox_OghXMq{background:var(--dsw-alias-bg-layer-2);border-radius:10px;gap:8px;margin:18px 0;padding:14px;display:grid}.run2skill_revisionBox_OghXMq label{font-size:14px;font-weight:600}.run2skill_revisionBox_OghXMq textarea{box-sizing:border-box;resize:vertical;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);width:100%;min-height:84px;color:var(--dsw-alias-label-primary);font:inherit;border-radius:10px;padding:10px 12px;line-height:1.5}.run2skill_revisionBox_OghXMq textarea:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:2px}.run2skill_revisionBox_OghXMq textarea:disabled{cursor:not-allowed;opacity:.65}.run2skill_revisionBox_OghXMq>:last-child{justify-self:start}.run2skill_danger_OghXMq{color:var(--dsw-alias-state-error-primary)}.run2skill_backdrop_OghXMq,.run2skill_rejectOverlay_OghXMq{background:var(--dsw-alias-bg-mask-1);position:fixed;inset:0}.run2skill_backdrop_OghXMq{z-index:999}.run2skill_rejectOverlay_OghXMq{z-index:1001;place-items:center;padding:16px;display:grid}.run2skill_legacyDialog_OghXMq{z-index:1000;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary);box-shadow:0 16px 48px var(--dsw-alias-bg-mask-1);border-radius:16px;grid-template-columns:minmax(16rem,24rem) minmax(0,1fr);gap:16px;padding:16px;display:grid;position:fixed;inset:5vh 5vw;overflow:hidden}.run2skill_blocked_OghXMq{pointer-events:none;display:contents}.run2skill_queue_OghXMq,.run2skill_legacyDetail_OghXMq{min-width:0;overflow:auto}.run2skill_legacyHeader_OghXMq{justify-content:space-between;align-items:center;gap:8px;display:flex}.run2skill_legacyList_OghXMq{margin:0;padding:0;list-style:none}.run2skill_rejectCard_OghXMq{background:var(--dsw-alias-bg-layer-1);border-radius:16px;max-width:32rem;padding:16px}.run2skill_textBlock_OghXMq{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);max-width:100%;font-family:var(--ds-font-family-code);white-space:pre-wrap;overflow-wrap:anywhere;unicode-bidi:isolate;border-radius:8px;padding:14px;font-size:12px;line-height:1.75;overflow:auto}.run2skill_previewFacts_OghXMq{grid-template-columns:max-content 1fr;gap:6px 12px;display:grid}.run2skill_previewFacts_OghXMq dt,.run2skill_previewFacts_OghXMq dd{margin:0}@container (width>=760px){.run2skill_proposalLayout_OghXMq{grid-template-columns:minmax(200px,.8fr) minmax(0,1.8fr);gap:20px}.run2skill_proposalLayout_OghXMq .run2skill_detail_OghXMq{border-top:0;border-left:1px solid var(--dsw-alias-border-l2);padding:0 0 0 20px}}@container (width<=420px){.run2skill_proposalToolbar_OghXMq,.run2skill_detailFacts_OghXMq{grid-template-columns:1fr}.run2skill_proposalToolbar_OghXMq>:last-child{justify-self:start}.run2skill_detailFacts_OghXMq dt:not(:first-child){margin-top:8px}}@media (width<=720px){.run2skill_sectionBody_OghXMq{padding:8px 18px 20px}.run2skill_activityItem_OghXMq{flex-direction:column;align-items:flex-start}}";
5647
5647
  if (typeof document !== "undefined") upsertRun2skillStyle(css);
5648
5648
  var _run2skill_css_run2skill_settings_page_module_css_default = {
5649
- "proposalToolbar": "run2skill_proposalToolbar_OghXMq",
5650
- "attentionList": "run2skill_attentionList_OghXMq",
5651
- "revisionBox": "run2skill_revisionBox_OghXMq",
5652
- "rejectCard": "run2skill_rejectCard_OghXMq",
5653
- "activitySummary": "run2skill_activitySummary_OghXMq",
5654
- "previewFacts": "run2skill_previewFacts_OghXMq",
5655
- "detail": "run2skill_detail_OghXMq",
5656
- "legacyDetail": "run2skill_legacyDetail_OghXMq",
5657
- "detailFacts": "run2skill_detailFacts_OghXMq",
5658
- "legacyDialog": "run2skill_legacyDialog_OghXMq",
5659
- "page": "run2skill_page_OghXMq",
5660
- "rejectOverlay": "run2skill_rejectOverlay_OghXMq",
5661
- "proposalListButton": "run2skill_proposalListButton_OghXMq",
5662
- "empty": "run2skill_empty_OghXMq",
5663
- "sectionTitle": "run2skill_sectionTitle_OghXMq",
5664
- "status": "run2skill_status_OghXMq",
5649
+ "publicationFeedback": "run2skill_publicationFeedback_OghXMq",
5650
+ "sectionHeader": "run2skill_sectionHeader_OghXMq",
5651
+ "muted": "run2skill_muted_OghXMq",
5665
5652
  "backdrop": "run2skill_backdrop_OghXMq",
5666
- "legacyHeader": "run2skill_legacyHeader_OghXMq",
5667
- "learningStatusRow": "run2skill_learningStatusRow_OghXMq",
5653
+ "activitySummary": "run2skill_activitySummary_OghXMq",
5668
5654
  "proposalMeta": "run2skill_proposalMeta_OghXMq",
5669
- "activityList": "run2skill_activityList_OghXMq",
5670
- "muted": "run2skill_muted_OghXMq",
5671
- "legacyList": "run2skill_legacyList_OghXMq",
5672
- "textBlock": "run2skill_textBlock_OghXMq",
5655
+ "proposalName": "run2skill_proposalName_OghXMq",
5656
+ "previewFacts": "run2skill_previewFacts_OghXMq",
5657
+ "modeGroup": "run2skill_modeGroup_OghXMq",
5658
+ "revisionBox": "run2skill_revisionBox_OghXMq",
5659
+ "actions": "run2skill_actions_OghXMq",
5673
5660
  "sectionBody": "run2skill_sectionBody_OghXMq",
5674
- "activityItem": "run2skill_activityItem_OghXMq",
5675
- "sectionHeader": "run2skill_sectionHeader_OghXMq",
5676
- "publicationFeedback": "run2skill_publicationFeedback_OghXMq",
5661
+ "legacyDetail": "run2skill_legacyDetail_OghXMq",
5677
5662
  "proposalToolbarCompact": "run2skill_proposalToolbarCompact_OghXMq",
5678
5663
  "section": "run2skill_section_OghXMq",
5679
- "proposalName": "run2skill_proposalName_OghXMq",
5680
- "danger": "run2skill_danger_OghXMq",
5681
- "modeGroup": "run2skill_modeGroup_OghXMq",
5664
+ "proposalToolbar": "run2skill_proposalToolbar_OghXMq",
5665
+ "activityList": "run2skill_activityList_OghXMq",
5666
+ "detail": "run2skill_detail_OghXMq",
5667
+ "activityItem": "run2skill_activityItem_OghXMq",
5668
+ "technicalDetails": "run2skill_technicalDetails_OghXMq",
5669
+ "attentionGroup": "run2skill_attentionGroup_OghXMq",
5670
+ "proposalListButton": "run2skill_proposalListButton_OghXMq",
5671
+ "status": "run2skill_status_OghXMq",
5682
5672
  "queue": "run2skill_queue_OghXMq",
5683
- "actions": "run2skill_actions_OghXMq",
5684
5673
  "proposalLayout": "run2skill_proposalLayout_OghXMq",
5685
- "proposalList": "run2skill_proposalList_OghXMq",
5686
- "attentionGroup": "run2skill_attentionGroup_OghXMq",
5674
+ "page": "run2skill_page_OghXMq",
5675
+ "rejectCard": "run2skill_rejectCard_OghXMq",
5687
5676
  "toolbar": "run2skill_toolbar_OghXMq",
5688
- "technicalDetails": "run2skill_technicalDetails_OghXMq",
5689
- "intro": "run2skill_intro_OghXMq",
5690
- "blocked": "run2skill_blocked_OghXMq"
5677
+ "danger": "run2skill_danger_OghXMq",
5678
+ "sectionTitle": "run2skill_sectionTitle_OghXMq",
5679
+ "rejectOverlay": "run2skill_rejectOverlay_OghXMq",
5680
+ "textBlock": "run2skill_textBlock_OghXMq",
5681
+ "empty": "run2skill_empty_OghXMq",
5682
+ "attentionList": "run2skill_attentionList_OghXMq",
5683
+ "proposalList": "run2skill_proposalList_OghXMq",
5684
+ "learningStatusRow": "run2skill_learningStatusRow_OghXMq",
5685
+ "detailFacts": "run2skill_detailFacts_OghXMq",
5686
+ "legacyDialog": "run2skill_legacyDialog_OghXMq",
5687
+ "legacyHeader": "run2skill_legacyHeader_OghXMq",
5688
+ "blocked": "run2skill_blocked_OghXMq",
5689
+ "legacyList": "run2skill_legacyList_OghXMq"
5691
5690
  };
5692
5691
  //#endregion
5693
5692
  //#region src/client/purge-settings.ts
@@ -6194,7 +6193,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6194
6193
  return (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.Modal, {
6195
6194
  open: true,
6196
6195
  title: scope === "ALL" ? "确认清理所有缓存?" : `确认清理 ${scope} Run2Skill 数据?`,
6197
- description: "此操作只清理 Run2Skill 自己产生的中间缓存数据,不会卸载插件。",
6196
+ description: "清理 Run2Skill 的待处理草稿和中间缓存。",
6198
6197
  closeLabel: "关闭清理确认框",
6199
6198
  onClose: () => {
6200
6199
  props.controller.cancelPreview();
@@ -6249,7 +6248,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6249
6248
  const activeReceipt = state.inProgressReceipt?.state === "IN_PROGRESS" ? state.inProgressReceipt : void 0;
6250
6249
  const activePhase = active?.phase ?? activeReceipt?.phase ?? (activeReceipt === void 0 ? void 0 : "HIDING");
6251
6250
  const disabled = state.previewPending || state.mutationPending || active !== void 0 || activeReceipt !== void 0;
6252
- return (0, react.createElement)("section", { "aria-labelledby": "run2skill-purge-heading" }, (0, react.createElement)("h3", { id: "run2skill-purge-heading" }, "缓存清理"), (0, react.createElement)("p", null, "清理 Run2Skill 自己产生的中间缓存数据"), (0, react.createElement)("div", { className: _run2skill_css_run2skill_settings_page_module_css_default.actions }, (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.Button, {
6251
+ return (0, react.createElement)("section", { "aria-label": "缓存清理" }, (0, react.createElement)("div", { className: _run2skill_css_run2skill_settings_page_module_css_default.actions }, (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.Button, {
6253
6252
  variant: "outline",
6254
6253
  icon: (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.IconTrashOutlineMedium),
6255
6254
  disabled,
@@ -7534,7 +7533,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7534
7533
  const revisionDiff = proposal.revisionParent === void 0 ? [] : makeExactLineDiff(proposal.revisionParent.exactSkillBytes, proposal.exactSkillBytes);
7535
7534
  const revisionFeedbackBytes = new TextEncoder().encode(revisionFeedback.trim()).byteLength;
7536
7535
  const revisionFeedbackValid = revisionFeedback.trim().length > 0 && revisionFeedbackBytes <= 2048;
7537
- return (0, react.createElement)(react.Fragment, null, (0, react.createElement)("h3", null, coveringCandidate === void 0 ? `${describeProposalKind(proposal.kind)}:${makeSafeText(proposal.name)}` : `无需新建技能:继续使用 ${makeSafeText(coveringCandidate.name)}`), (0, react.createElement)("dl", { className: _run2skill_css_run2skill_settings_page_module_css_default.detailFacts }, coveringCandidate === void 0 ? (0, react.createElement)(react.Fragment, null, (0, react.createElement)("dt", null, "这个技能有什么用"), (0, react.createElement)("dd", null, makeSafeText(proposal.description)), (0, react.createElement)("dt", null, "什么时候会用到"), (0, react.createElement)("dd", null, makeSafeText(proposal.whenToUse)), (0, react.createElement)("dt", null, "保存后在哪里可用"), (0, react.createElement)("dd", null, describePersistenceScope(proposal.persistenceScope))) : (0, react.createElement)(react.Fragment, null, (0, react.createElement)("dt", null, "原本想保存的经验"), (0, react.createElement)("dd", null, makeSafeText(proposal.description)), (0, react.createElement)("dt", null, "适用场景"), (0, react.createElement)("dd", null, makeSafeText(proposal.whenToUse)), (0, react.createElement)("dt", null, "这次经验的范围"), (0, react.createElement)("dd", null, describeProposalScope(proposal.kind, proposal.persistenceScope))), (0, react.createElement)("dt", null, "当前进度"), (0, react.createElement)("dd", null, describeProposalOutcome(detail))), (0, react.createElement)("h4", null, coveringCandidate === void 0 ? "为什么建议保存" : "为什么无需新建"), (0, react.createElement)("p", null, makeSafeText(proposal.curationRationale)), ...detail.experiences.map((experience) => (0, react.createElement)("article", { key: experience.experienceId }, (0, react.createElement)("strong", null, `${describeExperienceType(experience.type)} · 来自明确表达`), (0, react.createElement)("p", null, makeSafeText(experience.lesson)))), (0, react.createElement)("h4", null, "参考的对话内容"), (0, react.createElement)("p", { className: _run2skill_css_run2skill_settings_page_module_css_default.muted }, "以下片段来自本次对话,并已过滤不可安全展示的内容。"), ...detail.evidenceRefs.map((evidence, index) => (0, react.createElement)("article", { key: `${String(evidence.messageSeq)}:${evidence.excerptDigest}` }, (0, react.createElement)("strong", null, `对话片段 ${String(index + 1)}${evidence.truncated ? "(内容较长,已节选)" : ""}`), (0, react.createElement)(ProposalTextView, {
7536
+ return (0, react.createElement)(react.Fragment, null, (0, react.createElement)("h3", null, coveringCandidate === void 0 ? `${describeProposalKind(proposal.kind)}:${makeSafeText(proposal.name)}` : `无需新建技能:继续使用 ${makeSafeText(coveringCandidate.name)}`), (0, react.createElement)("dl", { className: _run2skill_css_run2skill_settings_page_module_css_default.detailFacts }, coveringCandidate === void 0 ? (0, react.createElement)(react.Fragment, null, (0, react.createElement)("dt", null, "这个技能有什么用"), (0, react.createElement)("dd", null, makeSafeText(proposal.description)), (0, react.createElement)("dt", null, "什么时候会用到"), (0, react.createElement)("dd", null, makeSafeText(proposal.whenToUse)), (0, react.createElement)("dt", null, "保存后在哪里可用"), (0, react.createElement)("dd", null, describePersistenceScope(proposal.persistenceScope))) : (0, react.createElement)(react.Fragment, null, (0, react.createElement)("dt", null, "原本想保存的经验"), (0, react.createElement)("dd", null, makeSafeText(proposal.description)), (0, react.createElement)("dt", null, "适用场景"), (0, react.createElement)("dd", null, makeSafeText(proposal.whenToUse)), (0, react.createElement)("dt", null, "这次经验的范围"), (0, react.createElement)("dd", null, describeProposalScope(proposal.kind, proposal.persistenceScope))), (0, react.createElement)("dt", null, "当前进度"), (0, react.createElement)("dd", null, describeProposalOutcome(detail))), (0, react.createElement)("h4", null, coveringCandidate === void 0 ? "为什么建议保存" : "为什么无需新建"), (0, react.createElement)("p", null, makeSafeText(proposal.curationRationale)), ...detail.experiences.map((experience) => (0, react.createElement)("article", { key: experience.experienceId }, (0, react.createElement)("strong", null, `${describeExperienceType(experience.type)} · 来自明确表达`), (0, react.createElement)("p", null, makeSafeText(experience.lesson)))), (0, react.createElement)("h4", null, "参考的对话内容"), ...detail.evidenceRefs.map((evidence, index) => (0, react.createElement)("article", { key: `${String(evidence.messageSeq)}:${evidence.excerptDigest}` }, (0, react.createElement)("strong", null, `对话片段 ${String(index + 1)}${evidence.truncated ? "(内容较长,已节选)" : ""}`), (0, react.createElement)(ProposalTextView, {
7538
7537
  value: evidence.excerpt,
7539
7538
  mode: "SAFE",
7540
7539
  label: `参考的对话内容 ${String(index + 1)}`
@@ -7558,7 +7557,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7558
7557
  onClick: () => {
7559
7558
  props.setTextMode("RAW");
7560
7559
  }
7561
- }, "按原文显示")), (0, react.createElement)("h4", null, coveringCandidate === void 0 ? "确认要保存的技能说明" : "用于判断的草稿内容"), (0, react.createElement)("p", { className: _run2skill_css_run2skill_settings_page_module_css_default.muted }, coveringCandidate === void 0 ? "这是 Agent 以后会遵循的完整说明。开头是技能名称和设置,标题下方是具体规则。" : "这份草稿不会保存,仅用于核对已有技能是否已经包含相同经验。"), (0, react.createElement)(ProposalTextView, {
7560
+ }, "按原文显示")), (0, react.createElement)("h4", null, coveringCandidate === void 0 ? "确认要保存的技能说明" : "用于判断的草稿内容"), (0, react.createElement)(ProposalTextView, {
7562
7561
  value: proposal.exactSkillBytes,
7563
7562
  mode: props.textMode,
7564
7563
  label: coveringCandidate === void 0 ? "确认要保存的技能说明" : "用于判断的草稿内容"
@@ -7572,7 +7571,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7572
7571
  }, (0, react.createElement)("label", { htmlFor: `run2skill-revision-${proposal.proposalId}` }, "想怎么修改?"), (0, react.createElement)("p", {
7573
7572
  id: `run2skill-revision-help-${proposal.proposalId}`,
7574
7573
  className: _run2skill_css_run2skill_settings_page_module_css_default.muted
7575
- }, "写一条简短意见。Run2Skill 会重新生成完整草稿,原草稿不会直接发布。"), (0, react.createElement)("textarea", {
7574
+ }, "根据意见生成新版草稿,审核后保存。"), (0, react.createElement)("textarea", {
7576
7575
  id: `run2skill-revision-${proposal.proposalId}`,
7577
7576
  value: revisionFeedback,
7578
7577
  rows: 3,
@@ -7629,7 +7628,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7629
7628
  }, "放弃草稿"))));
7630
7629
  }
7631
7630
  function RejectConfirmationBody(props) {
7632
- return (0, react.createElement)(react.Fragment, null, (0, react.createElement)("h3", { id: "run2skill-reject-title" }, "确认放弃这份技能草稿?"), (0, react.createElement)("p", { id: "run2skill-reject-description" }, "现有 Skill 不会改变;这份技能草稿将离开待处理队列;经过筛选的学习材料仍按项目规则保留。"), (0, react.createElement)("button", {
7631
+ return (0, react.createElement)(react.Fragment, null, (0, react.createElement)("h3", { id: "run2skill-reject-title" }, "确认放弃这份技能草稿?"), (0, react.createElement)("p", { id: "run2skill-reject-description" }, "移除这份待处理草稿,保留已有 Skill 和学习材料。"), (0, react.createElement)("button", {
7633
7632
  type: "button",
7634
7633
  "data-initial-focus": true,
7635
7634
  disabled: props.disabled,
@@ -7945,7 +7944,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7945
7944
  props.workspaceId,
7946
7945
  scopeIdentity
7947
7946
  ]);
7948
- return (0, react.createElement)("div", { className: _run2skill_css_run2skill_settings_page_module_css_default.sectionBody }, (0, react.createElement)("p", { className: _run2skill_css_run2skill_settings_page_module_css_default.muted }, "展示最近沉淀的 Skill"), visibleState.phase === "LOADING" ? (0, react.createElement)("p", { role: "status" }, "正在读取最近活动…") : null, visibleState.phase === "ERROR" ? (0, react.createElement)("p", { role: "alert" }, "最近活动暂不可用。") : null, visibleState.phase === "READY" && visibleState.items.length === 0 ? (0, react.createElement)("p", null, "最近 7 天没有成功沉淀的 Skill。") : null, visibleState.items.length === 0 ? null : (0, react.createElement)("ul", { className: _run2skill_css_run2skill_settings_page_module_css_default.activityList }, ...visibleState.items.map((item) => (0, react.createElement)("li", {
7947
+ return (0, react.createElement)("div", { className: _run2skill_css_run2skill_settings_page_module_css_default.sectionBody }, visibleState.phase === "LOADING" ? (0, react.createElement)("p", { role: "status" }, "正在读取最近活动…") : null, visibleState.phase === "ERROR" ? (0, react.createElement)("p", { role: "alert" }, "最近活动暂不可用。") : null, visibleState.phase === "READY" && visibleState.items.length === 0 ? (0, react.createElement)("p", null, "最近 7 天没有成功沉淀的 Skill。") : null, visibleState.items.length === 0 ? null : (0, react.createElement)("ul", { className: _run2skill_css_run2skill_settings_page_module_css_default.activityList }, ...visibleState.items.map((item) => (0, react.createElement)("li", {
7949
7948
  className: _run2skill_css_run2skill_settings_page_module_css_default.activityItem,
7950
7949
  key: item.activityId
7951
7950
  }, (0, react.createElement)("div", { className: _run2skill_css_run2skill_settings_page_module_css_default.activitySummary }, (0, react.createElement)("strong", null, item.skillName), (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.Pill, null, item.operation === "CREATED" ? "新建技能" : "更新技能"), usefulActivityScope(visibleState.items, item) ? (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.Pill, null, describePersistenceScope(item.scope)) : null), (0, react.createElement)("time", {
@@ -8155,7 +8154,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8155
8154
  return (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.Toast, {
8156
8155
  key: toast.sequence,
8157
8156
  icon: (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.IconWarningOutlineMedium),
8158
- text: `Run2Skill 有 ${String(toast.count)} 项需要处理,请前往设置 → 内置插件 → Run2Skill`,
8157
+ text: `Run2Skill 有 ${String(toast.count)} 项需要处理,请前往左侧栏 → 插件 → Run2Skill`,
8159
8158
  onDone: () => {
8160
8159
  setToast(void 0);
8161
8160
  }
@@ -8164,14 +8163,14 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8164
8163
  function AutomaticLearningSection(props) {
8165
8164
  const state = (0, react.useSyncExternalStore)(props.controller.subscribe, props.controller.getSnapshot, props.controller.getSnapshot);
8166
8165
  const disabled = state.status !== "ready" || !state.writable || state.saving;
8167
- return (0, react.createElement)("div", { className: _run2skill_css_run2skill_settings_page_module_css_default.sectionBody }, (0, react.createElement)("p", { className: _run2skill_css_run2skill_settings_page_module_css_default.muted }, "在后台识别可复用经验并生成待确认的技能草稿;关闭后,明确说“保存为 Skill”仍然有效。"), (0, react.createElement)("div", { className: _run2skill_css_run2skill_settings_page_module_css_default.actions }, (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.Button, {
8166
+ return (0, react.createElement)("div", { className: _run2skill_css_run2skill_settings_page_module_css_default.sectionBody }, (0, react.createElement)("p", { className: _run2skill_css_run2skill_settings_page_module_css_default.muted }, "自动生成技能草稿;关闭后可手动请求保存。"), (0, react.createElement)("div", { className: _run2skill_css_run2skill_settings_page_module_css_default.actions }, (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.Button, {
8168
8167
  variant: state.automaticLearning ? "primary" : "outline",
8169
8168
  "aria-pressed": state.automaticLearning === true,
8170
8169
  disabled,
8171
8170
  onClick: () => {
8172
8171
  props.controller.setAutomaticLearning(state.automaticLearning !== true);
8173
8172
  }
8174
- }, state.saving ? "正在保存…" : state.automaticLearning ? "自动学习已开启" : "自动学习已关闭"), (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.Pill, null, "沿用当前会话模型")), state.error === void 0 ? null : (0, react.createElement)("p", {
8173
+ }, state.saving ? "正在保存…" : state.automaticLearning ? "自动学习已开启" : "自动学习已关闭")), state.error === void 0 ? null : (0, react.createElement)("p", {
8175
8174
  role: "status",
8176
8175
  className: _run2skill_css_run2skill_settings_page_module_css_default.danger
8177
8176
  }, "设置已变化,请刷新后重试。"));
@@ -8434,7 +8433,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8434
8433
  }), (0, react.createElement)(ManagedConfirmationModal, {
8435
8434
  open: dismiss !== void 0,
8436
8435
  title: dismiss?.failureCode === "COVERED_NEEDS_CONFIRMATION" ? "使用已有 Skill,不生成新草稿?" : "确认关闭此待处理事项?",
8437
- description: dismiss?.failureCode === "COVERED_NEEDS_CONFIRMATION" ? "确认后,此项将从待处理列表移除,Run2Skill 不会为这次经验生成新草稿;已有 Skill 和 DSH 原始会话记录不会改变。" : "关闭后,本次自动沉淀不会继续,也不会生成草稿;已有 Skill 和 DSH 的原始会话记录不会改变。",
8436
+ description: dismiss?.failureCode === "COVERED_NEEDS_CONFIRMATION" ? "移除此待处理项,继续使用已有 Skill。" : "结束本次整理,保留已有 Skill 和会话记录。",
8438
8437
  disabled: pending !== void 0,
8439
8438
  triggerRef: dismissTriggerRef,
8440
8439
  onClose: () => {
@@ -8452,7 +8451,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8452
8451
  return (0, react.createElement)(ManagedConfirmationModal, {
8453
8452
  ...props,
8454
8453
  title: "确认放弃这份技能草稿?",
8455
- description: "现有 Skill 不会改变;这份技能草稿将离开待处理队列。",
8454
+ description: "移除这份待处理草稿,保留已有 Skill。",
8456
8455
  confirmLabel: "确认放弃"
8457
8456
  });
8458
8457
  }
@@ -8684,7 +8683,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8684
8683
  ref: hostTab.ref,
8685
8684
  className: _run2skill_css_run2skill_settings_page_module_css_default.page,
8686
8685
  "data-run2skill-settings-page": true
8687
- }, (0, react.createElement)("p", { className: _run2skill_css_run2skill_settings_page_module_css_default.intro }, "Run2Skill 在后台自动沉淀经验;这里展示当前状态、需要处理的事项和持久设置。"), visibleFeedback === void 0 ? null : (0, react.createElement)("div", { className: _run2skill_css_run2skill_settings_page_module_css_default.publicationFeedback }, (0, react.createElement)("p", {
8686
+ }, visibleFeedback === void 0 ? null : (0, react.createElement)("div", { className: _run2skill_css_run2skill_settings_page_module_css_default.publicationFeedback }, (0, react.createElement)("p", {
8688
8687
  role: "status",
8689
8688
  "aria-live": "polite",
8690
8689
  "aria-atomic": true
@@ -8790,12 +8789,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8790
8789
  purgeController.dispose();
8791
8790
  disposeStyle();
8792
8791
  };
8793
- }, "run2skill: native settings surface");
8794
- context.slots.inject("settings.plugins.tab", () => context.slots.register({
8795
- name: "settings.plugins.tab",
8796
- id: "run2skill",
8797
- order: 20,
8798
- label: "Run2Skill",
8792
+ }, "run2skill: native plugin detail surface");
8793
+ context.slots.inject("plugins.bundle.config", () => context.slots.register({
8794
+ name: "plugins.bundle.config",
8795
+ key: "dsh-run2skill",
8799
8796
  inject: () => ({
8800
8797
  controller,
8801
8798
  purgeController,
package/locale/en.json ADDED
@@ -0,0 +1,6 @@
1
+ {
2
+ "meta": {
3
+ "title": "Run2Skill",
4
+ "description": "Turn conversation lessons into reusable Skills"
5
+ }
6
+ }
package/locale/zh.json ADDED
@@ -0,0 +1,6 @@
1
+ {
2
+ "meta": {
3
+ "title": "Run2Skill",
4
+ "description": "把对话经验整理成可复用的 Skill"
5
+ }
6
+ }
package/package.json CHANGED
@@ -1,7 +1,8 @@
1
1
  {
2
2
  "name": "dsh-run2skill",
3
- "version": "0.5.0-alpha.3",
3
+ "version": "0.5.0-alpha.4",
4
4
  "description": "Turn explicit DSH session experience into reviewable native Skills",
5
+ "icon": "./assets/run2skill-logo.webp",
5
6
  "keywords": [
6
7
  "deepseek-harness",
7
8
  "dsh",
@@ -42,7 +43,8 @@
42
43
  "types": "./lib/typert.remote-client.d.ts",
43
44
  "default": "./lib/typert.remote-client.js"
44
45
  },
45
- "./package.json": "./package.json"
46
+ "./package.json": "./package.json",
47
+ "./locale/*.json": "./locale/*.json"
46
48
  },
47
49
  "files": [
48
50
  "lib",
@@ -50,7 +52,9 @@
50
52
  "README.en.md",
51
53
  "README.md",
52
54
  "LICENSE",
53
- "THIRD_PARTY_NOTICES.md"
55
+ "THIRD_PARTY_NOTICES.md",
56
+ "assets/run2skill-logo.webp",
57
+ "locale/*.json"
54
58
  ],
55
59
  "dsh": {
56
60
  "bundle": {
@@ -60,8 +64,7 @@
60
64
  "platform": "web",
61
65
  "inject": [
62
66
  "@deepseek-ai/dsh-client-ui-primitives",
63
- "@deepseek-ai/dsh-client-ui-settings",
64
- "@deepseek-ai/dsh-client-ui-settings-plugins",
67
+ "@deepseek-ai/dsh-client-ui-plugin-manager",
65
68
  "@deepseek-ai/dsh-api-remotes"
66
69
  ]
67
70
  }