dsh-tunetune 0.0.0-stage → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/INSTALL.md +39 -0
- package/LICENSE +202 -0
- package/NOTICE +4 -0
- package/README.md +177 -2
- package/dsh/client.js +116 -0
- package/dsh/cordis.patch.yml +5 -0
- package/dsh/host.js +164 -0
- package/dsh/icon.svg +1 -0
- package/dsh/locale/en.json +6 -0
- package/dsh/locale/zh.json +6 -0
- package/dsh/panels.js +152 -0
- package/dsh/skills.js +47 -0
- package/dsh/studies.js +96 -0
- package/dsh/ui/app.js +171 -0
- package/dsh/ui/index.html +13 -0
- package/dsh/ui/style.css +71 -0
- package/package.json +57 -4
- package/plugins/tunetune/skills/build-evaluation/LICENSE.txt +202 -0
- package/plugins/tunetune/skills/build-evaluation/SKILL.md +33 -0
- package/plugins/tunetune/skills/research-workspace/LICENSE.txt +202 -0
- package/plugins/tunetune/skills/research-workspace/SKILL.md +33 -0
- package/plugins/tunetune/skills/research-workspace/assets/panel/assets/index-B91UmRNB.js +15 -0
- package/plugins/tunetune/skills/research-workspace/assets/panel/assets/index-Bhs_7zLt.css +1 -0
- package/plugins/tunetune/skills/research-workspace/assets/panel/favicon.svg +8 -0
- package/plugins/tunetune/skills/research-workspace/assets/panel/index.html +17 -0
- package/plugins/tunetune/skills/research-workspace/assets/templates/AGENTS.md +32 -0
- package/plugins/tunetune/skills/research-workspace/assets/templates/project.json +6 -0
- package/plugins/tunetune/skills/research-workspace/assets/templates/proposal.json +4 -0
- package/plugins/tunetune/skills/research-workspace/assets/templates/resources.json +3 -0
- package/plugins/tunetune/skills/research-workspace/evals/evals.json +144 -0
- package/plugins/tunetune/skills/research-workspace/manifest.json +61 -0
- package/plugins/tunetune/skills/research-workspace/references/agent-adapters.md +27 -0
- package/plugins/tunetune/skills/research-workspace/references/domains/audio.md +7 -0
- package/plugins/tunetune/skills/research-workspace/references/domains/image-generation.md +7 -0
- package/plugins/tunetune/skills/research-workspace/references/domains/language-models.md +7 -0
- package/plugins/tunetune/skills/research-workspace/references/domains/multimodal.md +7 -0
- package/plugins/tunetune/skills/research-workspace/references/domains/spatial.md +7 -0
- package/plugins/tunetune/skills/research-workspace/references/domains/tabular.md +7 -0
- package/plugins/tunetune/skills/research-workspace/references/domains/text.md +7 -0
- package/plugins/tunetune/skills/research-workspace/references/domains/time-series.md +7 -0
- package/plugins/tunetune/skills/research-workspace/references/domains/video.md +7 -0
- package/plugins/tunetune/skills/research-workspace/references/domains/vision.md +7 -0
- package/plugins/tunetune/skills/research-workspace/references/records.md +106 -0
- package/plugins/tunetune/skills/research-workspace/references/resource-planning.md +11 -0
- package/plugins/tunetune/skills/research-workspace/references/technical-map.md +49 -0
- package/plugins/tunetune/skills/research-workspace/references/tools-map.md +16 -0
- package/plugins/tunetune/skills/research-workspace/references/tools.md +167 -0
- package/plugins/tunetune/skills/research-workspace/scripts/init.py +256 -0
- package/plugins/tunetune/skills/research-workspace/scripts/monitor.py +180 -0
- package/plugins/tunetune/skills/research-workspace/scripts/records.py +1254 -0
- package/plugins/tunetune/skills/research-workspace/scripts/resources.py +320 -0
- package/plugins/tunetune/skills/research-workspace/scripts/run.py +397 -0
- package/plugins/tunetune/skills/research-workspace/scripts/scout.py +399 -0
- package/plugins/tunetune/skills/research-workspace/scripts/workspace.py +955 -0
- package/plugins/tunetune/skills/run-experiments/LICENSE.txt +202 -0
- package/plugins/tunetune/skills/run-experiments/SKILL.md +37 -0
- package/plugins/tunetune/skills/tunetune-init/LICENSE.txt +202 -0
- package/plugins/tunetune/skills/tunetune-init/SKILL.md +31 -0
package/INSTALL.md
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Install TuneTune and start a study
|
|
2
|
+
|
|
3
|
+
Install the four skills, initialize the current conversation directory, open the panel and continue with the person's original request in their language. Do not silently create a child study directory.
|
|
4
|
+
|
|
5
|
+
## Install the skills
|
|
6
|
+
|
|
7
|
+
Use the user-supplied repository, normally https://github.com/nanshine/tunetune; do not substitute another publisher. Skip this step when `research-workspace`, `tunetune-init`, `build-evaluation` and `run-experiments` are already installed side by side.
|
|
8
|
+
|
|
9
|
+
With Node.js available, install for the current application only, user-wide so later studies in other directories need nothing new. Use that application's skills CLI identifier, such as `codex`, `claude-code`, `cursor`, `opencode`, `trae`, `trae-cn`, `qoder` or `qoder-cn`:
|
|
10
|
+
|
|
11
|
+
```sh
|
|
12
|
+
npx skills add nanshine/tunetune --global --agent <application> -y
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Do not use `--agent '*'` on the person's behalf, since it writes into every supported application. Without Node.js, or when the skills CLI does not know the application, clone into a temporary directory outside the project and copy the four folders under `plugins/tunetune/skills/` into the application's user skill directory: `~/.claude/skills/` for Claude Code, `~/.agents/skills/` for Codex, `~/.cursor/skills/` for Cursor, `~/.config/opencode/skills/` for OpenCode, `~/.trae/skills/` or `~/.trae-cn/skills/` for Trae, `~/.qoder/skills/` or `~/.qoder-cn/skills/` for Qoder. For any other application, use the user skill directory its documentation names, and say that TuneTune has not been tested there. Accept only ordinary files and directories. Refuse to replace existing skill folders that differ, and tell the person instead: their research may be pinned to those tools.
|
|
16
|
+
|
|
17
|
+
Plugins work too and need no Node.js: in Claude Code, `/plugin marketplace add nanshine/tunetune` then `/plugin install tunetune@tunetune`; in Codex, `codex plugin marketplace add nanshine/tunetune` then `codex plugin add tunetune@tunetune`. Leave the choice of plugin to the person.
|
|
18
|
+
|
|
19
|
+
In DeepSeek Harness, the `dsh-tunetune` plugin brings the skills and shows the panel beside the conversation. Installing plugin code is the person's decision: suggest **Plugins** in the app, or `dsh plugin --profile <profile> add dsh-tunetune` for the profile they run (the desktop app uses `desktop`), and continue once they confirm; restart DeepSeek Harness if TuneTune does not appear. Without the plugin, copy the four folders into `~/.dsh/skills/` as above. See the shared skill's `references/agent-adapters.md` for how it runs the panel.
|
|
20
|
+
|
|
21
|
+
## Initialize the current directory
|
|
22
|
+
|
|
23
|
+
Check Python 3.10+ on macOS/Linux. Read the installed shared skill's `references/agent-adapters.md`, then run its initializer with actual paths:
|
|
24
|
+
|
|
25
|
+
```sh
|
|
26
|
+
python3 <research-workspace skill>/scripts/init.py --project <current-directory>
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
It verifies the skill's manifest, adds only the missing project guide, minimal research files and pinned tools under `.workspace/app/`, and preserves existing compatible research and instructions. It refuses older research formats and projects pinned to other tools without migrating them; explain that plainly instead of working around it.
|
|
30
|
+
|
|
31
|
+
## Open and continue
|
|
32
|
+
|
|
33
|
+
Start the panel in a managed session and give the actual printed address once it responds:
|
|
34
|
+
|
|
35
|
+
```sh
|
|
36
|
+
python3 .workspace/app/workspace.py --project . --port 0 --open
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Continue in this conversation by reading the installed skills; do not ask the person to inspect a skill picker. Mention a refresh only when the application documents one, such as `/reload-skills` in Claude Code for a new top-level skills directory, or when the person reports the skills missing, with a continuation sentence carrying the original request. Report installation in a sentence, then use `research-workspace` and `tunetune-init` to investigate the goal. An open panel is not a background research scheduler.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
|
|
2
|
+
Apache License
|
|
3
|
+
Version 2.0, January 2004
|
|
4
|
+
http://www.apache.org/licenses/
|
|
5
|
+
|
|
6
|
+
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
7
|
+
|
|
8
|
+
1. Definitions.
|
|
9
|
+
|
|
10
|
+
"License" shall mean the terms and conditions for use, reproduction,
|
|
11
|
+
and distribution as defined by Sections 1 through 9 of this document.
|
|
12
|
+
|
|
13
|
+
"Licensor" shall mean the copyright owner or entity authorized by
|
|
14
|
+
the copyright owner that is granting the License.
|
|
15
|
+
|
|
16
|
+
"Legal Entity" shall mean the union of the acting entity and all
|
|
17
|
+
other entities that control, are controlled by, or are under common
|
|
18
|
+
control with that entity. For the purposes of this definition,
|
|
19
|
+
"control" means (i) the power, direct or indirect, to cause the
|
|
20
|
+
direction or management of such entity, whether by contract or
|
|
21
|
+
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
22
|
+
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
23
|
+
|
|
24
|
+
"You" (or "Your") shall mean an individual or Legal Entity
|
|
25
|
+
exercising permissions granted by this License.
|
|
26
|
+
|
|
27
|
+
"Source" form shall mean the preferred form for making modifications,
|
|
28
|
+
including but not limited to software source code, documentation
|
|
29
|
+
source, and configuration files.
|
|
30
|
+
|
|
31
|
+
"Object" form shall mean any form resulting from mechanical
|
|
32
|
+
transformation or translation of a Source form, including but
|
|
33
|
+
not limited to compiled object code, generated documentation,
|
|
34
|
+
and conversions to other media types.
|
|
35
|
+
|
|
36
|
+
"Work" shall mean the work of authorship, whether in Source or
|
|
37
|
+
Object form, made available under the License, as indicated by a
|
|
38
|
+
copyright notice that is included in or attached to the work
|
|
39
|
+
(an example is provided in the Appendix below).
|
|
40
|
+
|
|
41
|
+
"Derivative Works" shall mean any work, whether in Source or Object
|
|
42
|
+
form, that is based on (or derived from) the Work and for which the
|
|
43
|
+
editorial revisions, annotations, elaborations, or other modifications
|
|
44
|
+
represent, as a whole, an original work of authorship. For the purposes
|
|
45
|
+
of this License, Derivative Works shall not include works that remain
|
|
46
|
+
separable from, or merely link (or bind by name) to the interfaces of,
|
|
47
|
+
the Work and Derivative Works thereof.
|
|
48
|
+
|
|
49
|
+
"Contribution" shall mean any work of authorship, including
|
|
50
|
+
the original version of the Work and any modifications or additions
|
|
51
|
+
to that Work or Derivative Works thereof, that is intentionally
|
|
52
|
+
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
53
|
+
or by an individual or Legal Entity authorized to submit on behalf of
|
|
54
|
+
the copyright owner. For the purposes of this definition, "submitted"
|
|
55
|
+
means any form of electronic, verbal, or written communication sent
|
|
56
|
+
to the Licensor or its representatives, including but not limited to
|
|
57
|
+
communication on electronic mailing lists, source code control systems,
|
|
58
|
+
and issue tracking systems that are managed by, or on behalf of, the
|
|
59
|
+
Licensor for the purpose of discussing and improving the Work, but
|
|
60
|
+
excluding communication that is conspicuously marked or otherwise
|
|
61
|
+
designated in writing by the copyright owner as "Not a Contribution."
|
|
62
|
+
|
|
63
|
+
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
64
|
+
on behalf of whom a Contribution has been received by Licensor and
|
|
65
|
+
subsequently incorporated within the Work.
|
|
66
|
+
|
|
67
|
+
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
68
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
69
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
70
|
+
copyright license to reproduce, prepare Derivative Works of,
|
|
71
|
+
publicly display, publicly perform, sublicense, and distribute the
|
|
72
|
+
Work and such Derivative Works in Source or Object form.
|
|
73
|
+
|
|
74
|
+
3. Grant of Patent License. Subject to the terms and conditions of
|
|
75
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
76
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
77
|
+
(except as stated in this section) patent license to make, have made,
|
|
78
|
+
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
79
|
+
where such license applies only to those patent claims licensable
|
|
80
|
+
by such Contributor that are necessarily infringed by their
|
|
81
|
+
Contribution(s) alone or by combination of their Contribution(s)
|
|
82
|
+
with the Work to which such Contribution(s) was submitted. If You
|
|
83
|
+
institute patent litigation against any entity (including a
|
|
84
|
+
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
85
|
+
or a Contribution incorporated within the Work constitutes direct
|
|
86
|
+
or contributory patent infringement, then any patent licenses
|
|
87
|
+
granted to You under this License for that Work shall terminate
|
|
88
|
+
as of the date such litigation is filed.
|
|
89
|
+
|
|
90
|
+
4. Redistribution. You may reproduce and distribute copies of the
|
|
91
|
+
Work or Derivative Works thereof in any medium, with or without
|
|
92
|
+
modifications, and in Source or Object form, provided that You
|
|
93
|
+
meet the following conditions:
|
|
94
|
+
|
|
95
|
+
(a) You must give any other recipients of the Work or
|
|
96
|
+
Derivative Works a copy of this License; and
|
|
97
|
+
|
|
98
|
+
(b) You must cause any modified files to carry prominent notices
|
|
99
|
+
stating that You changed the files; and
|
|
100
|
+
|
|
101
|
+
(c) You must retain, in the Source form of any Derivative Works
|
|
102
|
+
that You distribute, all copyright, patent, trademark, and
|
|
103
|
+
attribution notices from the Source form of the Work,
|
|
104
|
+
excluding those notices that do not pertain to any part of
|
|
105
|
+
the Derivative Works; and
|
|
106
|
+
|
|
107
|
+
(d) If the Work includes a "NOTICE" text file as part of its
|
|
108
|
+
distribution, then any Derivative Works that You distribute must
|
|
109
|
+
include a readable copy of the attribution notices contained
|
|
110
|
+
within such NOTICE file, excluding those notices that do not
|
|
111
|
+
pertain to any part of the Derivative Works, in at least one
|
|
112
|
+
of the following places: within a NOTICE text file distributed
|
|
113
|
+
as part of the Derivative Works; within the Source form or
|
|
114
|
+
documentation, if provided along with the Derivative Works; or,
|
|
115
|
+
within a display generated by the Derivative Works, if and
|
|
116
|
+
wherever such third-party notices normally appear. The contents
|
|
117
|
+
of the NOTICE file are for informational purposes only and
|
|
118
|
+
do not modify the License. You may add Your own attribution
|
|
119
|
+
notices within Derivative Works that You distribute, alongside
|
|
120
|
+
or as an addendum to the NOTICE text from the Work, provided
|
|
121
|
+
that such additional attribution notices cannot be construed
|
|
122
|
+
as modifying the License.
|
|
123
|
+
|
|
124
|
+
You may add Your own copyright statement to Your modifications and
|
|
125
|
+
may provide additional or different license terms and conditions
|
|
126
|
+
for use, reproduction, or distribution of Your modifications, or
|
|
127
|
+
for any such Derivative Works as a whole, provided Your use,
|
|
128
|
+
reproduction, and distribution of the Work otherwise complies with
|
|
129
|
+
the conditions stated in this License.
|
|
130
|
+
|
|
131
|
+
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
132
|
+
any Contribution intentionally submitted for inclusion in the Work
|
|
133
|
+
by You to the Licensor shall be under the terms and conditions of
|
|
134
|
+
this License, without any additional terms or conditions.
|
|
135
|
+
Notwithstanding the above, nothing herein shall supersede or modify
|
|
136
|
+
the terms of any separate license agreement you may have executed
|
|
137
|
+
with Licensor regarding such Contributions.
|
|
138
|
+
|
|
139
|
+
6. Trademarks. This License does not grant permission to use the trade
|
|
140
|
+
names, trademarks, service marks, or product names of the Licensor,
|
|
141
|
+
except as required for reasonable and customary use in describing the
|
|
142
|
+
origin of the Work and reproducing the content of the NOTICE file.
|
|
143
|
+
|
|
144
|
+
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
145
|
+
agreed to in writing, Licensor provides the Work (and each
|
|
146
|
+
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
147
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
148
|
+
implied, including, without limitation, any warranties or conditions
|
|
149
|
+
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
150
|
+
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
151
|
+
appropriateness of using or redistributing the Work and assume any
|
|
152
|
+
risks associated with Your exercise of permissions under this License.
|
|
153
|
+
|
|
154
|
+
8. Limitation of Liability. In no event and under no legal theory,
|
|
155
|
+
whether in tort (including negligence), contract, or otherwise,
|
|
156
|
+
unless required by applicable law (such as deliberate and grossly
|
|
157
|
+
negligent acts) or agreed to in writing, shall any Contributor be
|
|
158
|
+
liable to You for damages, including any direct, indirect, special,
|
|
159
|
+
incidental, or consequential damages of any character arising as a
|
|
160
|
+
result of this License or out of the use or inability to use the
|
|
161
|
+
Work (including but not limited to damages for loss of goodwill,
|
|
162
|
+
work stoppage, computer failure or malfunction, or any and all
|
|
163
|
+
other commercial damages or losses), even if such Contributor
|
|
164
|
+
has been advised of the possibility of such damages.
|
|
165
|
+
|
|
166
|
+
9. Accepting Warranty or Additional Liability. While redistributing
|
|
167
|
+
the Work or Derivative Works thereof, You may choose to offer,
|
|
168
|
+
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
169
|
+
or other liability obligations and/or rights consistent with this
|
|
170
|
+
License. However, in accepting such obligations, You may act only
|
|
171
|
+
on Your own behalf and on Your sole responsibility, not on behalf
|
|
172
|
+
of any other Contributor, and only if You agree to indemnify,
|
|
173
|
+
defend, and hold each Contributor harmless for any liability
|
|
174
|
+
incurred by, or claims asserted against, such Contributor by reason
|
|
175
|
+
of your accepting any such warranty or additional liability.
|
|
176
|
+
|
|
177
|
+
END OF TERMS AND CONDITIONS
|
|
178
|
+
|
|
179
|
+
APPENDIX: How to apply the Apache License to your work.
|
|
180
|
+
|
|
181
|
+
To apply the Apache License to your work, attach the following
|
|
182
|
+
boilerplate notice, with the fields enclosed by brackets "[]"
|
|
183
|
+
replaced with your own identifying information. (Don't include
|
|
184
|
+
the brackets!) The text should be enclosed in the appropriate
|
|
185
|
+
comment syntax for the file format. We also recommend that a
|
|
186
|
+
file or class name and description of purpose be included on the
|
|
187
|
+
same "printed page" as the copyright notice for easier
|
|
188
|
+
identification within third-party archives.
|
|
189
|
+
|
|
190
|
+
Copyright [yyyy] [name of copyright owner]
|
|
191
|
+
|
|
192
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
193
|
+
you may not use this file except in compliance with the License.
|
|
194
|
+
You may obtain a copy of the License at
|
|
195
|
+
|
|
196
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
197
|
+
|
|
198
|
+
Unless required by applicable law or agreed to in writing, software
|
|
199
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
200
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
201
|
+
See the License for the specific language governing permissions and
|
|
202
|
+
limitations under the License.
|
package/NOTICE
ADDED
package/README.md
CHANGED
|
@@ -1,3 +1,178 @@
|
|
|
1
|
-
|
|
1
|
+
<div align="center">
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
<img src="docs/assets/hero.png" alt="TuneTune:喷漆小鬼比出手指枪,喷出两团蓝色涂鸦" width="100%">
|
|
4
|
+
|
|
5
|
+
# TuneTune
|
|
6
|
+
|
|
7
|
+
**说出你的需求,Agent 在你的电脑上帮你研究出一个能用的私有小模型。**
|
|
8
|
+
|
|
9
|
+
你提需求、做审核,Agent 当研究负责人 —— 从一句话到本地模型,每一步都有证据。
|
|
10
|
+
|
|
11
|
+
`本地运行` · `数据不出电脑` · `Codex / Claude Code / Cursor 等 Agent 通用`
|
|
12
|
+
|
|
13
|
+
</div>
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## 一句话开始
|
|
18
|
+
|
|
19
|
+
把下面这句话交给能读写本地文件、运行命令的 Agent(Codex、Claude Code 等):
|
|
20
|
+
|
|
21
|
+
> 用 TuneTune(https://github.com/nanshine/tunetune)帮我做一个能认出我家几只猫分别是谁的模型,照片在 `./photos` 里,就在当前文件夹开始。
|
|
22
|
+
|
|
23
|
+
换成你自己的需求就行。Agent 会安装 skills、初始化当前目录、打开研究工作台,然后开始调研。
|
|
24
|
+
|
|
25
|
+
**Agent:按 [INSTALL.md](INSTALL.md) 安装四个 skills,初始化当前目录,启动研究空间,再用 `tunetune-init` 延续原始需求。不要自行创建独立子研究目录。**
|
|
26
|
+
|
|
27
|
+
只需要 macOS / Linux 和 Python 3.10+。面板已随 skills 构建好,不用克隆源码,也不用 Node.js。
|
|
28
|
+
|
|
29
|
+
## 它长什么样
|
|
30
|
+
|
|
31
|
+
<!-- 占位:30 秒演示 GIF。流程:输入一句需求 → 提案窗口弹出 → 点确认 → 画布上长出几轮实验 → 拖入一张自己的照片看到结果。等待处用"⏩ 20 分钟后"字幕跳过。放到 docs/assets/demo.gif -->
|
|
32
|
+
<img src="docs/assets/demo.gif" alt="TuneTune 演示" width="100%">
|
|
33
|
+
|
|
34
|
+
<table>
|
|
35
|
+
<tr>
|
|
36
|
+
<td width="33%"><!-- 占位:提案窗口截图 docs/assets/proposal.png --><img src="docs/assets/proposal.png" alt="研究提案"><br><sub><b>研究提案</b>:方案、备选和资源上限,确认一次即可开始</sub></td>
|
|
37
|
+
<td width="33%"><!-- 占位:逐条审阅参考答案截图 docs/assets/review.png --><img src="docs/assets/review.png" alt="审阅参考答案"><br><sub><b>你来定标准</b>:主观判断的答案由你逐条审阅</sub></td>
|
|
38
|
+
<td width="33%"><!-- 占位:验收窗口截图 docs/assets/acceptance.png --><img src="docs/assets/acceptance.png" alt="模型对比"><br><sub><b>亲手试</b>:输入你自己的例子,对比各模型的真实输出</sub></td>
|
|
39
|
+
</tr>
|
|
40
|
+
</table>
|
|
41
|
+
|
|
42
|
+
## 为什么不一样
|
|
43
|
+
|
|
44
|
+
- **Agent 是研究负责人,你是审核人。** 它调查方法、准备资源、跑实验;你只在关键判断上拍板。
|
|
45
|
+
- **先评测,再下结论。** 先建立校准过的评测并测出基线,之后每一轮实验都和它比,不靠感觉。
|
|
46
|
+
- **你的数据、你的标准、你的模型。** 小模型在自己电脑上跑,同样的需求,不同的人会得到不同的结果。
|
|
47
|
+
- **诚实交付。** 只交付实际验证过的本地模型;达不到目标会直说原因,并给出下一步建议。
|
|
48
|
+
|
|
49
|
+
## 它怎样运作
|
|
50
|
+
|
|
51
|
+
```mermaid
|
|
52
|
+
flowchart LR
|
|
53
|
+
P["🧑 你<br/>说需求 · 审核 · 试用"] <-->|对话| A["🤖 Agent<br/>研究负责人"]
|
|
54
|
+
A -->|写入| F[("研究文件")]
|
|
55
|
+
F -->|展示| W["🖥️ 研究工作台<br/>无限画布 + 浮窗"]
|
|
56
|
+
W -->|你的确认与审阅| F
|
|
57
|
+
|
|
58
|
+
subgraph Skills["四个 skills"]
|
|
59
|
+
direction LR
|
|
60
|
+
S1["tunetune-init<br/>调研 · 提案 · 资源计划"] --> S2["build-evaluation<br/>评测 · 基线"] --> S3["run-experiments<br/>有界实验 · 交付"]
|
|
61
|
+
end
|
|
62
|
+
A -.按阶段使用.-> Skills
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
`research-workspace` 把整个研究串起来:管理文件、恢复进度,并把工作分派到上面三个阶段。
|
|
66
|
+
|
|
67
|
+
1. **提案**:Agent 先问清用途,再查当下可用的模型和方法,给出推荐路线、备选和资源上限(下载多大、花不花钱、数据出不出电脑)。你确认一次。
|
|
68
|
+
2. **评测**:搭建能真正打分的评测,同时测出最便宜可信的基线。答案取决于你的主观判断时,冻结前请你审阅。
|
|
69
|
+
3. **实验**:在预算内一轮轮实验,每轮说明测什么、为什么、和谁比。
|
|
70
|
+
4. **交付**:选出实际验证过的本地模型。你可以在工作台里用自己的输入亲手试。
|
|
71
|
+
|
|
72
|
+
环境、下载、缓存都放在研究目录里,不想要了,删掉目录即可。
|
|
73
|
+
|
|
74
|
+
## 可以拿它做什么
|
|
75
|
+
|
|
76
|
+
> 帮我做一个认出我家几只猫分别是谁的模型,照片在 `./photos`。
|
|
77
|
+
|
|
78
|
+
> 帮我按我自己的习惯给支付宝账单分类,账单不要传到网上。
|
|
79
|
+
|
|
80
|
+
> 帮我做一个判断哪些消息需要马上回复的模型,标准按我的来。
|
|
81
|
+
|
|
82
|
+
> 帮我做一个能整理客户留言、分出问题类型的模型。
|
|
83
|
+
|
|
84
|
+
<!-- 占位:更多真实案例与成果截图 -->
|
|
85
|
+
|
|
86
|
+
<details>
|
|
87
|
+
<summary><b>其他安装方式</b></summary>
|
|
88
|
+
|
|
89
|
+
用 skills CLI 一次安装,所有目录可用,把 `--agent` 换成你的应用:
|
|
90
|
+
|
|
91
|
+
```sh
|
|
92
|
+
npx skills add nanshine/tunetune --global --agent codex
|
|
93
|
+
npx skills add nanshine/tunetune --global --agent claude-code
|
|
94
|
+
npx skills add nanshine/tunetune --global --agent cursor
|
|
95
|
+
npx skills add nanshine/tunetune --global --agent opencode
|
|
96
|
+
npx skills add nanshine/tunetune --global --agent trae # Trae 国内版用 trae-cn
|
|
97
|
+
npx skills add nanshine/tunetune --global --agent qoder # Qoder 国内版用 qoder-cn
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
`--agent '*'` 会装到所有支持的应用;之后用 `npx skills update` 更新。没有 Node.js 时,把 `plugins/tunetune/skills/` 下的四个文件夹复制到应用的用户 skills 目录:
|
|
101
|
+
|
|
102
|
+
| 应用 | 用户 skills 目录 |
|
|
103
|
+
|---|---|
|
|
104
|
+
| Claude Code | `~/.claude/skills/` |
|
|
105
|
+
| Codex | `~/.agents/skills/` |
|
|
106
|
+
| Cursor | `~/.cursor/skills/` |
|
|
107
|
+
| OpenCode | `~/.config/opencode/skills/` |
|
|
108
|
+
| Trae / Trae CN | `~/.trae/skills/` / `~/.trae-cn/skills/` |
|
|
109
|
+
| Qoder / Qoder CN | `~/.qoder/skills/` / `~/.qoder-cn/skills/` |
|
|
110
|
+
| 其他应用 | 查阅其 skills 文档;不少应用也读取 `~/.agents/skills/` |
|
|
111
|
+
|
|
112
|
+
除 Claude Code 和 Codex 外,其他应用尚未逐一实测。
|
|
113
|
+
|
|
114
|
+
插件方式:
|
|
115
|
+
|
|
116
|
+
```text
|
|
117
|
+
# Claude Code
|
|
118
|
+
/plugin marketplace add nanshine/tunetune
|
|
119
|
+
/plugin install tunetune@tunetune
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
```sh
|
|
123
|
+
# Codex
|
|
124
|
+
codex plugin marketplace add nanshine/tunetune
|
|
125
|
+
codex plugin add tunetune@tunetune
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
装好后在想做研究的目录里说出需求即可。初始化只补齐缺失的文件,并把研究工具固定在 `.workspace/app/`,之后更新 skills 不会改动已有研究所用的工具;用其他版本工具创建的研究会被明确拒绝,不会自动迁移或覆盖。
|
|
129
|
+
|
|
130
|
+
</details>
|
|
131
|
+
|
|
132
|
+
<details>
|
|
133
|
+
<summary><b>仓库结构</b></summary>
|
|
134
|
+
|
|
135
|
+
| 路径 | 内容 |
|
|
136
|
+
|---|---|
|
|
137
|
+
| `plugins/tunetune/skills/` | 四个 skills:研究工作流、技术参考、研究工具、模板和构建好的面板,这就是全部分发内容 |
|
|
138
|
+
| `plugins/tunetune/` | 插件根目录,只含 skills 和插件清单 |
|
|
139
|
+
| `.claude-plugin/`、`.agents/plugins/` | 指向插件根目录的插件市场 |
|
|
140
|
+
| `workspace/` | 面板源码(React / TypeScript) |
|
|
141
|
+
| `scripts/` | 清单构建和本地演示工具 |
|
|
142
|
+
| `tests/` | 集成与安全测试 |
|
|
143
|
+
| `docs/` | [设计原则](docs/principles.md)等文档 |
|
|
144
|
+
|
|
145
|
+
</details>
|
|
146
|
+
|
|
147
|
+
<details>
|
|
148
|
+
<summary><b>开发与本地演示</b></summary>
|
|
149
|
+
|
|
150
|
+
需要 Node.js 22.12+ 和 Python 3.10+:
|
|
151
|
+
|
|
152
|
+
```sh
|
|
153
|
+
npm --prefix workspace ci
|
|
154
|
+
npm --prefix workspace run build
|
|
155
|
+
npm --prefix workspace test
|
|
156
|
+
python3 -B -m unittest discover -s tests -v
|
|
157
|
+
python3 scripts/build-skills.py
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
面板构建输出到 `plugins/tunetune/skills/research-workspace/assets/panel/`,并且需要提交,因为 `npx skills`、插件和克隆都直接取仓库里的 skills。修改分发的脚本、模板或面板后,重新运行 `build-skills.py`。
|
|
161
|
+
|
|
162
|
+
用合成数据看一个完整的研究状态:
|
|
163
|
+
|
|
164
|
+
```sh
|
|
165
|
+
python3 plugins/tunetune/skills/research-workspace/scripts/init.py --project /absolute/my-research
|
|
166
|
+
python3 scripts/create-demo.py --project /absolute/my-research
|
|
167
|
+
python3 /absolute/my-research/.workspace/app/workspace.py --project /absolute/my-research --port 0 --open
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
演示证明流程能跑通,不代表真实业务的效果。
|
|
171
|
+
|
|
172
|
+
</details>
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
<div align="center">
|
|
177
|
+
<sub>设计理念见 <a href="docs/principles.md">docs/principles.md</a> · <!-- 占位:许可证 --> License TBD</sub>
|
|
178
|
+
</div>
|
package/dsh/client.js
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
// TuneTune for DeepSeek Harness: the browser half.
|
|
2
|
+
// - a left-sidebar entry whose main area lists every study and opens its panel full size
|
|
3
|
+
// - a right-sidebar tab, offered on the guide page, showing the study of that conversation
|
|
4
|
+
// Both frame the Host's /tunetune/ui/ page; the research panel is the study's own pinned panel.
|
|
5
|
+
window.__ModuleLoader__.load({
|
|
6
|
+
id: 'dsh-tunetune',
|
|
7
|
+
factory: (require) => {
|
|
8
|
+
var module = { exports: {} };
|
|
9
|
+
var exports = module.exports;
|
|
10
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
11
|
+
|
|
12
|
+
const React = require('react');
|
|
13
|
+
const h = React.createElement;
|
|
14
|
+
const ID = 'dsh-tunetune';
|
|
15
|
+
const UI = '/tunetune/ui/';
|
|
16
|
+
const LABEL = { zh: 'TuneTune', en: 'TuneTune' };
|
|
17
|
+
const GUIDE = {
|
|
18
|
+
zh: '在对话旁边查看这个目录的模型研究:方案、评估、实验和验收。',
|
|
19
|
+
en: 'See this directory’s model research beside the conversation: proposal, evaluation, experiments and acceptance.',
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
// A dial with a small tuning mark.
|
|
23
|
+
function TuneIcon(props) {
|
|
24
|
+
const s = (props && props.size) || 18;
|
|
25
|
+
return h('svg', { width: s, height: s, viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', strokeWidth: 1.6, strokeLinecap: 'round' },
|
|
26
|
+
h('circle', { cx: 12, cy: 12, r: 8 }),
|
|
27
|
+
h('path', { d: 'M12 12l4-4' }),
|
|
28
|
+
h('path', { d: 'M12 4v2M20 12h-2M12 20v-2M4 12h2' }));
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function apply(ctx) {
|
|
32
|
+
const frames = new Set();
|
|
33
|
+
let scheme = null;
|
|
34
|
+
let lang = /^en\b/i.test(navigator.language) ? 'en' : 'zh';
|
|
35
|
+
const post = (frame) => {
|
|
36
|
+
const target = frame.contentWindow;
|
|
37
|
+
if (!target) return;
|
|
38
|
+
if (scheme) target.postMessage({ type: 'tunetune:scheme', scheme }, location.origin);
|
|
39
|
+
target.postMessage({ type: 'tunetune:locale', lang }, location.origin);
|
|
40
|
+
};
|
|
41
|
+
// Follow the harness's color scheme and language when those services exist.
|
|
42
|
+
ctx.inject(['theme'], (c) => {
|
|
43
|
+
const push = (snap) => { scheme = snap.active.colorScheme; frames.forEach(post); };
|
|
44
|
+
push(c.theme.getTheme());
|
|
45
|
+
c.on('theme/change', push);
|
|
46
|
+
});
|
|
47
|
+
ctx.inject(['locale'], (c) => {
|
|
48
|
+
const push = (snap) => { lang = /^en\b/i.test(snap.active) ? 'en' : 'zh'; frames.forEach(post); };
|
|
49
|
+
push(c.locale.getSnapshot());
|
|
50
|
+
c.on('locale/change', push);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
function Frame(props) {
|
|
54
|
+
const ref = React.useRef(null);
|
|
55
|
+
const query = props.sessionId ? `?session=${encodeURIComponent(props.sessionId)}&lang=${lang}` : `?lang=${lang}`;
|
|
56
|
+
const [src] = React.useState(() => UI + query);
|
|
57
|
+
React.useEffect(() => {
|
|
58
|
+
const self = ref.current;
|
|
59
|
+
if (self) frames.add(self);
|
|
60
|
+
function onMessage(event) {
|
|
61
|
+
const frame = ref.current;
|
|
62
|
+
if (!frame || event.source !== frame.contentWindow || event.origin !== location.origin) return;
|
|
63
|
+
const message = event.data;
|
|
64
|
+
if (message && message.type === 'tunetune:open-session' && typeof message.sessionId === 'string') {
|
|
65
|
+
try {
|
|
66
|
+
ctx.uiWorkspace.openSession(message.sessionId);
|
|
67
|
+
} catch (error) {
|
|
68
|
+
console.error('[tunetune] could not open the conversation', error);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
addEventListener('message', onMessage);
|
|
73
|
+
return () => { removeEventListener('message', onMessage); frames.delete(self); };
|
|
74
|
+
}, []);
|
|
75
|
+
return h('iframe', {
|
|
76
|
+
ref, src, title: LABEL[lang],
|
|
77
|
+
onLoad: (event) => post(event.currentTarget),
|
|
78
|
+
style: { width: '100%', height: '100%', border: 0, display: 'block' },
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function StudiesPanel() {
|
|
83
|
+
return h(Frame, {});
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// The tab body receives the conversation it belongs to.
|
|
87
|
+
function StudyTab(props) {
|
|
88
|
+
return h(Frame, { sessionId: props.sessionId });
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
ctx.slots.inject('sidebar.panellist', () =>
|
|
92
|
+
ctx.slots.register({ name: 'sidebar.panellist', id: ID, order: 7, label: () => LABEL[lang] }, TuneIcon));
|
|
93
|
+
ctx.slots.inject('main', () => ctx.slots.register({ name: 'main', key: ID }, StudiesPanel));
|
|
94
|
+
|
|
95
|
+
// The right sidebar is optional in a composition; without it the main entry still works.
|
|
96
|
+
ctx.inject(['sidebarRightTabs'], (c) => {
|
|
97
|
+
const disposers = [];
|
|
98
|
+
disposers.push(c.sidebarRightTabs.register({
|
|
99
|
+
id: ID,
|
|
100
|
+
kind: ID,
|
|
101
|
+
title: () => LABEL[lang],
|
|
102
|
+
keepMounted: true,
|
|
103
|
+
guide: [{ id: ID, order: 30, title: () => LABEL[lang], description: () => GUIDE[lang], icon: TuneIcon }],
|
|
104
|
+
}));
|
|
105
|
+
disposers.push(c.slots.inject('sidebar.right.pane.tab', () =>
|
|
106
|
+
c.slots.register({ name: 'sidebar.right.pane.tab', key: ID }, StudyTab)));
|
|
107
|
+
return () => { for (const dispose of disposers) if (typeof dispose === 'function') dispose(); };
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
exports.isPlugin = true;
|
|
112
|
+
exports.inject = ['slots', 'uiWorkspace'];
|
|
113
|
+
exports.apply = apply;
|
|
114
|
+
return module.exports;
|
|
115
|
+
},
|
|
116
|
+
});
|