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 +54 -119
- package/README.md +54 -123
- package/assets/run2skill-logo.webp +0 -0
- package/lib/client.js +51 -54
- package/locale/en.json +6 -0
- package/locale/zh.json +6 -0
- package/package.json +8 -5
package/README.en.md
CHANGED
|
@@ -1,169 +1,104 @@
|
|
|
1
|
-
|
|
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
|
-
|
|
5
|
+
<p align="center"><strong>Turn today's lessons into tomorrow's skills.</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&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
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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
|
-
|
|
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
|
-

|
|
23
|
+
|
|
24
|
+
*Main-branch interface · sample draft walkthrough*
|
|
26
25
|
|
|
27
|
-
1.
|
|
28
|
-
2.
|
|
29
|
-
3.
|
|
30
|
-
4.
|
|
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
|
|
32
|
+
<summary>View key screens</summary>
|
|
34
33
|
|
|
35
|
-

|
|
36
35
|
|
|
37
|
-

|
|
38
37
|
|
|
39
|
-

|
|
40
39
|
|
|
41
40
|
</details>
|
|
42
41
|
|
|
43
42
|
## Install
|
|
44
43
|
|
|
45
|
-
|
|
44
|
+
Supports DSH **0.2.0-rc.2** on Windows Desktop and Web.
|
|
46
45
|
|
|
47
|
-
|
|
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
|
|
49
|
+
dsh plugin --profile desktop add dsh-run2skill
|
|
51
50
|
```
|
|
52
51
|
|
|
53
|
-
|
|
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
|
|
55
|
+
dsh plugin --profile web add dsh-run2skill
|
|
73
56
|
```
|
|
74
57
|
|
|
75
|
-
Restart DSH
|
|
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
|
|
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
|
-
|
|
62
|
+
Work with your Agent as usual and describe the practices you want to reuse:
|
|
88
63
|
|
|
89
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
73
|
+
## Settings
|
|
99
74
|
|
|
100
|
-
|
|
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
|
-
|
|
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
|
-
|
|
83
|
+
Update, then restart DSH:
|
|
133
84
|
|
|
134
85
|
```bash
|
|
135
|
-
dsh plugin --profile
|
|
86
|
+
dsh plugin --profile desktop add dsh-run2skill
|
|
136
87
|
```
|
|
137
88
|
|
|
138
89
|
Uninstall:
|
|
139
90
|
|
|
140
91
|
```bash
|
|
141
|
-
dsh plugin --profile
|
|
92
|
+
dsh plugin --profile desktop remove dsh-run2skill
|
|
142
93
|
```
|
|
143
94
|
|
|
144
|
-
|
|
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
|
-
##
|
|
97
|
+
## Help and contribute
|
|
158
98
|
|
|
159
|
-
- [
|
|
160
|
-
- [
|
|
161
|
-
- [
|
|
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
|
-
|
|
104
|
+
[MIT License](LICENSE) · [Third-party licenses](THIRD_PARTY_NOTICES.md)
|
package/README.md
CHANGED
|
@@ -1,173 +1,104 @@
|
|
|
1
|
-
|
|
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
|
-
|
|
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&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
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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
|
-
|
|
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
|
-

|
|
28
23
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
24
|
+
*main 分支界面 · 示例草稿演示*
|
|
25
|
+
|
|
26
|
+
1. 打开 **左侧栏 → 插件 → Run2Skill**。
|
|
27
|
+
2. 查看草稿的用途、适用范围、对话来源和完整内容。
|
|
28
|
+
3. 按需提出修改意见,或直接**确认并保存**。
|
|
29
|
+
4. 在**最近活动**中查看结果,下次相关任务即可使用这个 Skill。
|
|
33
30
|
|
|
34
31
|
<details>
|
|
35
|
-
<summary
|
|
32
|
+
<summary>查看关键界面</summary>
|
|
36
33
|
|
|
37
|
-

|
|
38
35
|
|
|
39
|
-

|
|
40
37
|
|
|
41
|
-

|
|
42
39
|
|
|
43
40
|
</details>
|
|
44
41
|
|
|
45
42
|
## 安装
|
|
46
43
|
|
|
47
|
-
|
|
44
|
+
适用于 DSH **0.2.0-rc.2** 的 Windows Desktop 和 Web。
|
|
48
45
|
|
|
49
|
-
|
|
46
|
+
**Desktop**:在应用中通过 **Manage dsh Command…** 配置命令,完成首次启动后退出应用,再运行:
|
|
50
47
|
|
|
51
48
|
```bash
|
|
52
|
-
dsh plugin --profile desktop add dsh-run2skill
|
|
49
|
+
dsh plugin --profile desktop add dsh-run2skill
|
|
53
50
|
```
|
|
54
51
|
|
|
55
|
-
|
|
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
|
|
55
|
+
dsh plugin --profile web add dsh-run2skill
|
|
75
56
|
```
|
|
76
57
|
|
|
77
|
-
|
|
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
|
-
|
|
62
|
+
照常与 Agent 工作,把值得复用的做法说清楚:
|
|
90
63
|
|
|
91
|
-
|
|
64
|
+
- **纠正**:“先写失败测试,再修实现。”
|
|
65
|
+
- **约束**:“这个项目的 GitHub 文案统一用中文。”
|
|
66
|
+
- **工作流**:“先核对上游版本,再运行兼容性检查。”
|
|
67
|
+
- **保存请求**:“把这个流程保存成 Skill,以后复用。”
|
|
92
68
|
|
|
93
|
-
|
|
69
|
+
Run2Skill 在会话空闲或收到保存请求时整理经验。有草稿需要审核时,DSH 会通知你。也可以打开插件页,点击**立即整理本次经验**。
|
|
94
70
|
|
|
95
|
-
|
|
96
|
-
2. 在待处理列表中查看技能草稿、适用范围和内容差异。
|
|
97
|
-
3. 选择确认并保存、要求修改、放弃草稿,或在保存失败后重试。
|
|
98
|
-
4. 保存成功后,结果就是普通的 DSH 原生 Skill;即使以后卸载 run2skill,它仍然可以被 DSH 使用。
|
|
71
|
+
每份草稿都附有对话来源。你可以确认保存、要求修改,或放弃草稿。Skill 支持保存到**当前项目**或**所有项目**,使用 DSH 默认的 Skill 目录。
|
|
99
72
|
|
|
100
|
-
|
|
73
|
+
## 设置
|
|
101
74
|
|
|
102
|
-
|
|
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
|
|
86
|
+
dsh plugin --profile desktop add dsh-run2skill
|
|
140
87
|
```
|
|
141
88
|
|
|
142
89
|
卸载:
|
|
143
90
|
|
|
144
91
|
```bash
|
|
145
|
-
dsh plugin --profile
|
|
92
|
+
dsh plugin --profile desktop remove dsh-run2skill
|
|
146
93
|
```
|
|
147
94
|
|
|
148
|
-
|
|
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
|
-
- [
|
|
164
|
-
- [
|
|
165
|
-
- [
|
|
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
|
-
|
|
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}.
|
|
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
|
-
"
|
|
5650
|
-
"
|
|
5651
|
-
"
|
|
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
|
-
"
|
|
5667
|
-
"learningStatusRow": "run2skill_learningStatusRow_OghXMq",
|
|
5653
|
+
"activitySummary": "run2skill_activitySummary_OghXMq",
|
|
5668
5654
|
"proposalMeta": "run2skill_proposalMeta_OghXMq",
|
|
5669
|
-
"
|
|
5670
|
-
"
|
|
5671
|
-
"
|
|
5672
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
5680
|
-
"
|
|
5681
|
-
"
|
|
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
|
-
"
|
|
5686
|
-
"
|
|
5674
|
+
"page": "run2skill_page_OghXMq",
|
|
5675
|
+
"rejectCard": "run2skill_rejectCard_OghXMq",
|
|
5687
5676
|
"toolbar": "run2skill_toolbar_OghXMq",
|
|
5688
|
-
"
|
|
5689
|
-
"
|
|
5690
|
-
"
|
|
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: "
|
|
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-
|
|
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, "参考的对话内容"),
|
|
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)(
|
|
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
|
-
}, "
|
|
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" }, "
|
|
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 },
|
|
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)}
|
|
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 }, "
|
|
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 ? "自动学习已开启" : "自动学习已关闭")
|
|
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" ? "
|
|
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: "
|
|
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
|
-
},
|
|
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
|
|
8794
|
-
context.slots.inject("
|
|
8795
|
-
name: "
|
|
8796
|
-
|
|
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
package/locale/zh.json
ADDED
package/package.json
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-run2skill",
|
|
3
|
-
"version": "0.5.0-alpha.
|
|
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-
|
|
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
|
}
|