dsh-claude-data 0.0.0-stage → 2.14.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/LICENSE +26 -0
- package/NOTICE.md +62 -0
- package/README.md +43 -2
- package/cordis.patch.yml +13 -0
- package/docs/DETAIL.md +27 -0
- package/docs/DETAIL.zh.md +16 -0
- package/icon.svg +9 -0
- package/lib/index.js +167 -0
- package/locale/en.json +7 -0
- package/locale/zh.json +7 -0
- package/package.json +104 -4
- package/skills/claude-data/SKILL.md +536 -0
- package/skills/claude-data/artifact-type/reference/admin-setup.md +64 -0
- package/skills/claude-data/artifact-type/reference/dependent-calls.md +33 -0
- package/skills/claude-data/artifact-type/reference/design-defaults.md +51 -0
- package/skills/claude-data/artifact-type/reference/design-system.md +65 -0
- package/skills/claude-data/artifact-type/reference/exporting.md +23 -0
- package/skills/claude-data/artifact-type/reference/features.md +54 -0
- package/skills/claude-data/artifact-type/reference/looks.md +55 -0
- package/skills/claude-data/artifact-type/reference/one-writer.md +51 -0
- package/skills/claude-data/artifact-type/reference/questions.md +45 -0
- package/skills/claude-data/artifact-type/reference/read-aloud.md +61 -0
- package/skills/claude-data/artifact-type/reference/remix.md +43 -0
- package/skills/claude-data/artifact-type/reference/sources.md +63 -0
- package/skills/claude-data/artifact-type/reference/visual-short-script.md +146 -0
- package/skills/claude-data/artifact-type/reference/visual-short-skeleton.md +131 -0
- package/skills/claude-data/artifact-type/reference/visual-short.md +63 -0
- package/skills/claude-data/scripts/artifact.mjs +5688 -0
- package/skills/claude-data/scripts/editor/assets/anthropicons-fizzy-lake-CPTdBYLV.woff2 +0 -0
- package/skills/claude-data/scripts/editor/assets/index-B1CKpH_P.css +1 -0
- package/skills/claude-data/scripts/editor/assets/index-BWg-0IkN.js +569 -0
- package/skills/claude-data/scripts/editor/assets/working-mark-sheets-dAm26n99.js +1 -0
- package/skills/claude-data/scripts/editor/comments.js +103 -0
- package/skills/claude-data/scripts/editor/index.html +27 -0
- package/skills/claude-data/scripts/editor/local-host.js +481 -0
- package/skills/claude-data/scripts/editor/share-ui.js +208 -0
- package/skills/claude-data/scripts/editor/third-party-licenses.txt +1213 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
This MIT License covers only the original work of Jim Liu 宝玉 in this repository
|
|
2
|
+
and in the baoyu-design npm packages. It does not cover the material from
|
|
3
|
+
Anthropic or the third-party open-source code listed in NOTICE.md, which keep
|
|
4
|
+
their own terms.
|
|
5
|
+
|
|
6
|
+
MIT License
|
|
7
|
+
|
|
8
|
+
Copyright (c) 2026 Jim Liu 宝玉
|
|
9
|
+
|
|
10
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
11
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
12
|
+
in the Software without restriction, including without limitation the rights
|
|
13
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
14
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
15
|
+
furnished to do so, subject to the following conditions:
|
|
16
|
+
|
|
17
|
+
The above copyright notice and this permission notice shall be included in all
|
|
18
|
+
copies or substantial portions of the Software.
|
|
19
|
+
|
|
20
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
21
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
22
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
23
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
24
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
25
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
26
|
+
SOFTWARE.
|
package/NOTICE.md
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# Notices
|
|
2
|
+
|
|
3
|
+
baoyu-design holds material under three different sets of terms. The MIT License in [LICENSE](LICENSE) covers only the first. The same applies to the ChatGPT plugins in `chatgpt-plugins/`, each of which carries this file, and to the DeepSeek Harness plugins on npm, which ship this file next to their `LICENSE`.
|
|
4
|
+
|
|
5
|
+
[中文说明](#中文说明)
|
|
6
|
+
|
|
7
|
+
## 1. The maintainer's own work: MIT
|
|
8
|
+
|
|
9
|
+
Copyright (c) 2026 Jim Liu 宝玉, under the MIT License in [LICENSE](LICENSE):
|
|
10
|
+
|
|
11
|
+
- The local tooling: each skill's `scripts/artifact.mjs` and, where there is one, `scripts/server.mjs` (the command line and the local editor server), the local comments, and what lets the editors run on a local machine instead of claude.ai.
|
|
12
|
+
- The DeepSeek Harness plugins' own code and files: `dsh-plugins/*/lib/`, `cordis.patch.yml`, `locale/`, `docs/` and `icon.svg`.
|
|
13
|
+
- The ChatGPT plugins' own files: `chatgpt-plugins/*/plugin.json`, `README.md` and `assets/`, and `.agents/plugins/marketplace.json`. The skills inside them keep the terms of `skills/`.
|
|
14
|
+
- The parts of the skills' text written for local agents: how to open and run the editors, local paths and files, comments.
|
|
15
|
+
- A skill whose `license:` line says plain MIT is wholly the maintainer's work: all of its files are MIT.
|
|
16
|
+
- The READMEs, the changelogs, the images in `assets/` and the files in `.github/`.
|
|
17
|
+
- The maintainer's tools in `archive/baoyu-design/agents/`, apart from the open-source code vendored there (section 3).
|
|
18
|
+
|
|
19
|
+
## 2. Material from Anthropic: not MIT
|
|
20
|
+
|
|
21
|
+
baoyu-design brings claude.ai's Artifact types and Claude Design to local agents, so much of what it ships comes from Anthropic, PBC. That material stays Anthropic's. Anthropic has published no license for it, apart from the one file in section 2.1, and this project grants none: the MIT License does not apply to it. It is included so the skills work as they do on claude.ai. This project is independent and is not affiliated with or endorsed by Anthropic.
|
|
22
|
+
|
|
23
|
+
- **Skill instructions.** Each `skills/claude-*/SKILL.md` adapts the SKILL.md of a claude.ai Artifact type. The maintainer's local-agent changes are described in section 1.
|
|
24
|
+
- **Reference docs.** `skills/*/artifact-type/reference/`, and the copies under `scripts/editor/artifact-type/`: the craft, format and layout guides, font lists and other references of the Artifact types.
|
|
25
|
+
- **The `dataviz` skill.** `skills/dataviz/` is Anthropic's dataviz skill. Its palette validators include code from Color.js (MIT, Lea Verou and Chris Lilley), credited in the files.
|
|
26
|
+
- **The editors.** `skills/claude-*/scripts/editor/` holds editors reconstructed from the claude.ai Artifact-type runtimes: their interface, wording and behaviour are Anthropic's. The built files mix that reconstruction with the maintainer's local additions (section 1) and with open-source packages (section 3).
|
|
27
|
+
- **Compiled engines.** Where an editor ships a WebAssembly engine as upstream built it (a `*.wasm` file in its `scripts/editor/artifact-type/`), the engine is Anthropic's too. The open-source code compiled into it is listed in the notices shipped beside it (`THIRD_PARTY_NOTICES.md`, `RUST_STANDARD_LIBRARY_NOTICES.html`).
|
|
28
|
+
- **Icon fonts.** The Anthropicons icon fonts: the `anthropicons-*.woff2` files in the editors' `assets/` and `artifact-type/` folders, and the Anthropicons font faces embedded as data URIs in the editors' CSS.
|
|
29
|
+
- **The archived `baoyu-design` skill.** In `archive/baoyu-design/`: `system-prompt.md`, `references/upstream-system-prompt.md` and `references/upstream-sync/` (the Claude Design system prompt, a snapshot of it and its sync records), `built-in-skills/` (Claude Design's built-in skills) and `starter-components/` (Claude Design's starter components; the local patches are recorded in the `*-patch.md` files there).
|
|
30
|
+
|
|
31
|
+
### 2.1 frontend-design: Apache License 2.0
|
|
32
|
+
|
|
33
|
+
`archive/baoyu-design/built-in-skills/frontend-design.md` is Claude Design's copy of Anthropic's frontend-design skill, which Anthropic publishes under the Apache License 2.0. The full license text is in [`archive/baoyu-design/built-in-skills/LICENSE-frontend-design.txt`](archive/baoyu-design/built-in-skills/LICENSE-frontend-design.txt). The file was changed from the original: its frontmatter was rewritten for the built-in-skill format (its `license` line records the change), and its text follows the version Claude Design ships.
|
|
34
|
+
|
|
35
|
+
## 3. Third-party open-source code
|
|
36
|
+
|
|
37
|
+
The editors bundle open-source packages, such as React, Base UI, d3 and pptxgenjs. Each keeps its own license, which this project's license does not replace. The licenses are in each editor's `scripts/editor/third-party-licenses.txt`, and for the slides compiler in `scripts/editor/node/third-party-licenses.txt`. The open-source crates and the Rust standard library compiled into a WebAssembly engine are listed in the notices beside it.
|
|
38
|
+
|
|
39
|
+
The archived `baoyu-design` skill vendors React, ReactDOM, Babel and fflate (MIT) in `archive/baoyu-design/agents/vendor/`, and pptxgenjs (MIT) in `archive/baoyu-design/agents/gen-pptx/vendor/pptxgenjs/`, with its `LICENSE`.
|
|
40
|
+
|
|
41
|
+
## Questions and removal
|
|
42
|
+
|
|
43
|
+
If you hold rights in anything here and want it credited differently, changed or removed, open an issue at <https://github.com/JimLiu/baoyu-design/issues>.
|
|
44
|
+
|
|
45
|
+
## 中文说明
|
|
46
|
+
|
|
47
|
+
本仓库(以及 `chatgpt-plugins/` 里的 ChatGPT 插件、npm 上的 DeepSeek Harness 插件)里的内容分三类,许可各不相同。[LICENSE](LICENSE) 里的 MIT 许可只管第一类。
|
|
48
|
+
|
|
49
|
+
1. **维护者自己写的部分,MIT。** 本地命令行和编辑器服务器(各技能的 `scripts/artifact.mjs`,以及有的技能带的 `scripts/server.mjs`)、本地评论、让编辑器离开 claude.ai 在本机运行的那部分代码;DeepSeek Harness 插件自己的代码和文件(`dsh-plugins/*/lib/`、`cordis.patch.yml`、`locale/`、`docs/`、`icon.svg`);技能说明里为本地 Agent 写的部分;`license:` 一行只写 MIT 的技能,整个是维护者写的,它的全部文件都是;README、更新日志、`assets/` 里的图片、`.github/`;`archive/baoyu-design/agents/` 里维护者写的工具。
|
|
50
|
+
2. **取自 Anthropic 的部分,不适用 MIT。** 权利归 Anthropic。除 frontend-design 外,Anthropic 没有为这些内容公开许可,本项目也不授予任何许可。包括:
|
|
51
|
+
- 各 `skills/claude-*/SKILL.md` 所改编的 Artifact 类型技能说明;
|
|
52
|
+
- `artifact-type/reference/` 里的参考文档;
|
|
53
|
+
- `skills/dataviz/`(Anthropic 的 dataviz 技能);
|
|
54
|
+
- `scripts/editor/` 里从 claude.ai 运行时还原的编辑器(界面、文案和行为);
|
|
55
|
+
- 编辑器原样带上的 WebAssembly 引擎(`scripts/editor/artifact-type/` 里的 `*.wasm`),编进去的开源代码列在它旁边的 `THIRD_PARTY_NOTICES.md`、`RUST_STANDARD_LIBRARY_NOTICES.html` 里;
|
|
56
|
+
- Anthropicons 图标字体(`anthropicons-*.woff2` 文件,以及编辑器 CSS 里内嵌的字体);
|
|
57
|
+
- `archive/baoyu-design/` 里的 Claude Design 系统提示词、内置技能和起步组件。
|
|
58
|
+
|
|
59
|
+
`archive/baoyu-design/built-in-skills/frontend-design.md` 取自 Anthropic 以 Apache License 2.0 发布的 frontend-design 技能,许可全文见同目录的 `LICENSE-frontend-design.txt`。
|
|
60
|
+
3. **第三方开源代码,各按原许可。** 编辑器打进去的开源包(React、Base UI、d3、pptxgenjs 等)的许可见各编辑器的 `scripts/editor/third-party-licenses.txt`;归档技能里内置的 React、Babel、fflate、pptxgenjs 见 `archive/baoyu-design/agents/vendor/` 和 `agents/gen-pptx/vendor/pptxgenjs/LICENSE`。
|
|
61
|
+
|
|
62
|
+
本项目是独立的社区项目,与 Anthropic 无隶属或背书关系。权利人希望调整署名、修改或移除某部分内容,请在 <https://github.com/JimLiu/baoyu-design/issues> 提 issue。
|
package/README.md
CHANGED
|
@@ -1,3 +1,44 @@
|
|
|
1
|
-
#
|
|
1
|
+
# dsh-claude-data
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
A [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) plugin that adds the **claude-data** skill
|
|
4
|
+
from [baoyu-design](https://github.com/JimLiu/baoyu-design): the agent builds data-backed dashboards (charts, numbers
|
|
5
|
+
and tables over your CSV, TSV or JSON files, or data it gathers) as files in your workspace and opens them in a local
|
|
6
|
+
dashboard editor, with a Sources panel that shows where every number comes from.
|
|
7
|
+
|
|
8
|
+
## Install
|
|
9
|
+
|
|
10
|
+
In the DeepSeek Harness desktop app: **Plugins** → **Add plugin** → enter `dsh-claude-data` in **Package name or
|
|
11
|
+
address** → **Install**, and turn the plugin on. From the command line, for a CLI profile such as `web`:
|
|
12
|
+
|
|
13
|
+
```sh
|
|
14
|
+
dsh plugin --profile web add dsh-claude-data
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Then start a new session and ask for a dashboard, or type `/claude-data`. A workspace that has its own
|
|
18
|
+
`claude-data` skill (in `.agents/skills/` or `.dsh/skills/`) uses that copy instead of this plugin's.
|
|
19
|
+
|
|
20
|
+
To update, uninstall the plugin, install it again, and quit and reopen the app. For a day after a release the app's
|
|
21
|
+
package manager (pnpm) still picks the previous version; to get the new one sooner, enter the name with the version,
|
|
22
|
+
such as `dsh-claude-data@2.4.0`.
|
|
23
|
+
|
|
24
|
+
## What is inside
|
|
25
|
+
|
|
26
|
+
- `skills/claude-data/`: the skill as baoyu-design publishes it (`SKILL.md`, `artifact-type/reference/`, and the
|
|
27
|
+
prebuilt `scripts/`: the editor page and `artifact.mjs`, which is also its server).
|
|
28
|
+
- `lib/index.js`: the plugin. It registers the skill with the Harness skill registry and, when the skill loads, tells
|
|
29
|
+
the agent which Node executable runs `scripts/artifact.mjs`: the Host's own Node, the Node runtime the desktop app
|
|
30
|
+
ships, or `node` on PATH. Set `node` in the `claude-data` row's config to choose another. That is all this row does,
|
|
31
|
+
so you can turn it off and [keep the skill to one agent preset](https://github.com/JimLiu/baoyu-design/blob/main/dsh-plugins/README.md#keep-a-skill-to-one-preset).
|
|
32
|
+
- `cordis.patch.yml`: the bundle layer that mounts two rows: this plugin's, and its row of `dsh-claude-artifacts`.
|
|
33
|
+
|
|
34
|
+
[`dsh-claude-artifacts`](https://www.npmjs.com/package/dsh-claude-artifacts) installs with this plugin and does the rest,
|
|
35
|
+
whichever way the skill is set up: whenever the agent opens the editor it waits for comments, so a comment's **Send to Agent** box is there: send one and
|
|
36
|
+
the agent wakes up, changes the dashboard, and replies in the comment. It shows what is sent as a card in the chat, and adds **Artifacts**
|
|
37
|
+
to the left sidebar, one entry for all the baoyu-design plugins: the dashboards and everything else the agent has opened,
|
|
38
|
+
each a click away from its conversation and editor.
|
|
39
|
+
|
|
40
|
+
The editor server listens on 127.0.0.1 only and reads and writes only the dashboard's folder.
|
|
41
|
+
|
|
42
|
+
## License
|
|
43
|
+
|
|
44
|
+
Not all MIT. The plugin's own code and files (`lib/`, `cordis.patch.yml`, `locale/`, `docs/`, `icon.svg`) and the skill's local tooling are MIT, in `LICENSE`. The bundled `claude-data` skill is adapted from Anthropic's claude.ai Dashboard type: its instructions, references, page and icon fonts stay Anthropic's and are not under the MIT License. `NOTICE.md` sets out which is which. The page's open-source licenses are in `skills/claude-data/scripts/editor/third-party-licenses.txt`.
|
package/cordis.patch.yml
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# dsh-claude-data bundle patch: installing the package (the Plugins page, or
|
|
2
|
+
# `dsh plugin --profile <name> add <spec>`) adds it to the profile's bundles,
|
|
3
|
+
# and this layer mounts two rows. claude-data registers the skill with the
|
|
4
|
+
# profile's skill registry, for every preset; to give it to one preset, turn this
|
|
5
|
+
# row off and declare dsh-claude-data among that preset's plugins. claude-artifacts-data
|
|
6
|
+
# is dsh-claude-artifacts, what the baoyu-design plugins share (the Artifacts page, comments
|
|
7
|
+
# reaching the agent). It stays on whichever that is. Each plugin mounts it under its own id, so
|
|
8
|
+
# that the plugin can be removed while another one is installed; one of the rows does the work.
|
|
9
|
+
- insert:
|
|
10
|
+
- id: claude-artifacts-data
|
|
11
|
+
name: dsh-claude-artifacts
|
|
12
|
+
- id: claude-data
|
|
13
|
+
name: dsh-claude-data
|
package/docs/DETAIL.md
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Claude Data
|
|
2
|
+
|
|
3
|
+
Adds the **claude-data** skill to DeepSeek Harness. Ask for a dashboard ("a dashboard of this sales CSV by month
|
|
4
|
+
and region") and the agent builds it as files in your workspace: a folder holding the datasets, the files they load
|
|
5
|
+
and the page. It then starts a local dashboard editor and gives you its link.
|
|
6
|
+
|
|
7
|
+
## Using it
|
|
8
|
+
|
|
9
|
+
- Ask for a dashboard, metrics page, KPI tracker or report in plain words, or type `/claude-data` to call the
|
|
10
|
+
skill by name. Give it a CSV, TSV or JSON file, or ask it to gather the data.
|
|
11
|
+
- Open the link the agent gives you. In the desktop app it opens in the right sidebar's Browser, beside the
|
|
12
|
+
conversation (Settings → General → Open chat links in: **In-App Sidebar**, the default).
|
|
13
|
+
- The Sources panel shows where every number comes from, and downloads a source's rows as CSV. The agent's changes
|
|
14
|
+
show up in the page as it writes them.
|
|
15
|
+
- Comment on a chart, a number, a table or any other part of the page (Comment, or C). Tick **Send to Agent** and the
|
|
16
|
+
agent picks it up at once, even when the conversation is idle: it changes the dashboard and replies in the comment.
|
|
17
|
+
The comment also shows in the chat as a card; **View thread** on the card opens it in the editor. The box is there
|
|
18
|
+
while comments can reach the agent, which starts each time it gives you the link. After restarting the app, ask the
|
|
19
|
+
agent to open the dashboard again to bring it back.
|
|
20
|
+
- To change or refresh a dashboard later, ask the agent to revise its folder.
|
|
21
|
+
- A workspace that has its own `claude-data` skill (in `.agents/skills/` or `.dsh/skills/`) uses that copy
|
|
22
|
+
instead of this plugin's.
|
|
23
|
+
|
|
24
|
+
## What runs where
|
|
25
|
+
|
|
26
|
+
The editor is a small server on 127.0.0.1 that the skill's script starts in the background, one per dashboard. It
|
|
27
|
+
reads and writes only that dashboard's folder. The desktop app's own Node runtime runs it; nothing else is installed.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Claude 数据看板
|
|
2
|
+
|
|
3
|
+
给 DeepSeek Harness 加上 **claude-data** 技能。让 Agent 做一个数据看板("把这份销售 CSV 按月份和地区做成看板"),它会在工作区里把看板写成文件:一个文件夹,里面有数据集、数据集要加载的文件和页面。写完它会启动本地看板编辑器,把链接给你。
|
|
4
|
+
|
|
5
|
+
## 怎么用
|
|
6
|
+
|
|
7
|
+
- 直接用自然语言要看板、指标页、KPI 跟踪或报表,或者输入 `/claude-data` 点名调用这个技能。可以给它一个 CSV、TSV 或 JSON 文件,也可以让它自己去找数据。
|
|
8
|
+
- 打开 Agent 给的链接。桌面版里它会在右侧栏的浏览器里打开,和对话并排(设置 → 通用 → 聊天链接打开方式:**应用内侧栏**,默认就是这个)。
|
|
9
|
+
- 来源面板(Sources)会显示每个数字是从哪里来的,还能把某个来源的数据下载成 CSV。Agent 写的改动会实时出现在页面上。
|
|
10
|
+
- 在页面上可以给图表、数字、表格或任何一块加评论(点评论按钮或按 C)。勾上 **Send to Agent** 发出去,Agent 会马上接手,对话空闲时也一样:它改好看板,再在评论里回复你。评论也会以卡片的形式出现在对话里,点卡片上的 **View thread**(中文界面是「查看评论」)会在编辑器里打开这条评论。这个勾选框只在评论能发给 Agent 时出现;Agent 每次给你编辑器链接时都会开始等评论。重启应用后,让 Agent 再打开一次这个看板就能恢复。
|
|
11
|
+
- 以后要修改或刷新数据,让 Agent 修改这个看板的文件夹即可。
|
|
12
|
+
- 如果工作区自己带了 `claude-data` 技能(在 `.agents/skills/` 或 `.dsh/skills/` 里),这个工作区会用它自己那份,而不是插件里的。
|
|
13
|
+
|
|
14
|
+
## 运行方式
|
|
15
|
+
|
|
16
|
+
编辑器是技能脚本在后台启动的一个本地服务(127.0.0.1),一个看板一个,只读写这个看板自己的文件夹。用的是桌面版自带的 Node,不需要另外安装任何东西。
|
package/icon.svg
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 64 64">
|
|
2
|
+
<rect width="64" height="64" rx="14" fill="#D97757"/>
|
|
3
|
+
<rect x="11" y="13" width="42" height="38" rx="4" fill="#FFF7F2"/>
|
|
4
|
+
<rect x="16" y="18" width="14" height="3.5" rx="1.75" fill="#D97757"/>
|
|
5
|
+
<rect x="17" y="34" width="5" height="12" rx="1.5" fill="#E9B8A3"/>
|
|
6
|
+
<rect x="25" y="28" width="5" height="18" rx="1.5" fill="#D97757"/>
|
|
7
|
+
<rect x="33" y="31" width="5" height="15" rx="1.5" fill="#E9B8A3"/>
|
|
8
|
+
<rect x="41" y="24" width="5" height="22" rx="1.5" fill="#D97757"/>
|
|
9
|
+
</svg>
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
// dsh-claude-data 2.14.0: built from baoyu-design.
|
|
2
|
+
var define_PLUGIN_default = { name: "claude-data", provider: "dsh-claude-data", skills: [{ name: "claude-data", description: "Use this for a local, data-backed dashboard, metrics page, KPI tracker, scorecard, data visualization or recurring report that opens in the bundled live editor: a page or scroll story of charts, numbers and tables over datasets (a CSV/TSV/JSON or text file the user has, or data you gather and attach), with a Sources panel that shows where every number comes from. Read it when creating, filling, refreshing or revising one. You write the datasets, then the page as plain HTML, into the dashboard's own store with this skill's script. Not for a static HTML mockup or a picture of a dashboard.", scriptAlias: "A", comments: true }] };
|
|
3
|
+
|
|
4
|
+
import { readFile } from "node:fs/promises";
|
|
5
|
+
import { dirname as dirname2, join as join2, posix, sep, win32 } from "node:path";
|
|
6
|
+
import { fileURLToPath } from "node:url";
|
|
7
|
+
|
|
8
|
+
var HOST = Symbol.for("baoyu-design/dsh-artifacts-host");
|
|
9
|
+
function hostHub() {
|
|
10
|
+
const g = globalThis;
|
|
11
|
+
return g[HOST] ??= { members: [] };
|
|
12
|
+
}
|
|
13
|
+
function hostRunning() {
|
|
14
|
+
return hostHub().members.length > 0;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
import { statSync } from "node:fs";
|
|
18
|
+
import { delimiter, dirname, isAbsolute, join } from "node:path";
|
|
19
|
+
function isFile(path) {
|
|
20
|
+
try {
|
|
21
|
+
return statSync(path).isFile();
|
|
22
|
+
} catch {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function resolveNode(plugin, config = {}) {
|
|
27
|
+
if (config.node !== void 0) {
|
|
28
|
+
if (!isAbsolute(config.node) || !isFile(config.node)) {
|
|
29
|
+
throw new Error(`${plugin}: config.node must be an absolute path to an executable file: ${config.node}`);
|
|
30
|
+
}
|
|
31
|
+
return { path: config.node, from: "config" };
|
|
32
|
+
}
|
|
33
|
+
if (process.versions.electron === void 0) return { path: process.execPath, from: "host" };
|
|
34
|
+
const exe = process.platform === "win32" ? "node.exe" : "node";
|
|
35
|
+
const runtime = ["runtime", "primary-runtime", "dependencies", "node", "bin", exe];
|
|
36
|
+
const roots = [];
|
|
37
|
+
const resourcesPath = process.resourcesPath;
|
|
38
|
+
if (typeof resourcesPath === "string") roots.push(resourcesPath);
|
|
39
|
+
let dir = dirname(process.execPath);
|
|
40
|
+
for (let i = 0; i < 6; i++) {
|
|
41
|
+
roots.push(join(dir, "Resources"), join(dir, "resources"));
|
|
42
|
+
const parent = dirname(dir);
|
|
43
|
+
if (parent === dir) break;
|
|
44
|
+
dir = parent;
|
|
45
|
+
}
|
|
46
|
+
for (const root of roots) {
|
|
47
|
+
const candidate = join(root, ...runtime);
|
|
48
|
+
if (isFile(candidate)) return { path: candidate, from: "desktop runtime" };
|
|
49
|
+
}
|
|
50
|
+
for (const entry of (process.env.PATH ?? "").split(delimiter)) {
|
|
51
|
+
if (entry === "" || !isAbsolute(entry)) continue;
|
|
52
|
+
const candidate = join(entry, exe);
|
|
53
|
+
if (isFile(candidate)) return { path: candidate, from: "PATH" };
|
|
54
|
+
}
|
|
55
|
+
return { path: process.execPath, env: "ELECTRON_RUN_AS_NODE=1", from: "electron" };
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
var PLUGIN = define_PLUGIN_default;
|
|
59
|
+
var name = PLUGIN.name;
|
|
60
|
+
var inject = ["skills"];
|
|
61
|
+
var BUNDLED_SKILL_RANK = 600;
|
|
62
|
+
var packageRoot = fileURLToPath(new URL("../", import.meta.url));
|
|
63
|
+
function shellQuote(path) {
|
|
64
|
+
return `"${path.replace(/(["\\$`])/g, "\\$1")}"`;
|
|
65
|
+
}
|
|
66
|
+
function powerShellQuote(path) {
|
|
67
|
+
return `'${path.replace(/['\u2018-\u201b]/g, "$&$&")}'`;
|
|
68
|
+
}
|
|
69
|
+
function scriptCommand(node, script, args, platform) {
|
|
70
|
+
if (platform !== "win32") return [node.env, shellQuote(node.path), shellQuote(script), ...args].filter(Boolean).join(" ");
|
|
71
|
+
const [name2, value] = node.env?.split("=") ?? [];
|
|
72
|
+
const env = name2 ? `$env:${name2} = ${powerShellQuote(value ?? "")};` : "";
|
|
73
|
+
return [env, "&", powerShellQuote(node.path), powerShellQuote(script), ...args].filter(Boolean).join(" ");
|
|
74
|
+
}
|
|
75
|
+
function runtimeSection(skill, skillDir, node, platform = process.platform, watched = true) {
|
|
76
|
+
const windows = platform === "win32";
|
|
77
|
+
const script = (windows ? win32 : posix).join(skillDir, "scripts", "artifact.mjs");
|
|
78
|
+
const written = skill.scriptAlias === void 0 ? "`node <this skill's folder>/scripts/artifact.mjs <command>`" : `\`node $${skill.scriptAlias} <command>\` (\`${skill.scriptAlias}\` being \`<this skill's folder>/scripts/artifact.mjs\`)`;
|
|
79
|
+
const lines = [
|
|
80
|
+
"",
|
|
81
|
+
"",
|
|
82
|
+
"## Running the calls in DeepSeek Harness",
|
|
83
|
+
"",
|
|
84
|
+
"Wherever these pages, or the script's own output (its `stop`, `next` and other hints), say",
|
|
85
|
+
`${written}, run this in the shell instead, with the ${windows ? "`&` and the " : ""}quotes (the paths can contain spaces):`,
|
|
86
|
+
"",
|
|
87
|
+
windows ? "```powershell" : "```sh",
|
|
88
|
+
scriptCommand(node, script, ["<command> …"], platform),
|
|
89
|
+
"```",
|
|
90
|
+
"",
|
|
91
|
+
...windows ? [
|
|
92
|
+
"The shell here is PowerShell. PowerShell has no heredoc (`<<'EOF'`): where a page offers one, write the text to",
|
|
93
|
+
"a file and pass its path.",
|
|
94
|
+
""
|
|
95
|
+
] : [],
|
|
96
|
+
"`open` prints the editor's `url` (on 127.0.0.1): give it to the user as a Markdown link. In the DeepSeek Harness",
|
|
97
|
+
"app a chat link opens in the right sidebar's Browser, next to this conversation."
|
|
98
|
+
];
|
|
99
|
+
if (skill.comments && watched) {
|
|
100
|
+
const sent = skill.commentsBy === "mention" ? "A comment, reply or edit in the viewer that says `@agent` is sent to you (the viewer has no Send to Agent box)." : "The editor shows **Send to Agent** on a comment while comments can reach you; a comment sent with it is sent to you.";
|
|
101
|
+
lines.push(
|
|
102
|
+
"",
|
|
103
|
+
"### Comments sent to you from the editor",
|
|
104
|
+
"",
|
|
105
|
+
sent,
|
|
106
|
+
"Here DeepSeek Harness waits for them for you: after you run `open` it runs `comments <root> --wait` itself, and",
|
|
107
|
+
"each comment sent to you arrives in this conversation as a message with the threads (it wakes you when you are",
|
|
108
|
+
"idle; the next one is held until you are done with this one, so the page shows it as waiting its turn). Handle it",
|
|
109
|
+
"as Comments says",
|
|
110
|
+
skill.commentsBy === "mention" ? "(read the block, change the doc with `update`, then `comment-reply`)." : "(change the files, then `comment-reply`).",
|
|
111
|
+
"So do not start `comments --wait` yourself, where Comments says to: run `open` in the foreground (not",
|
|
112
|
+
"`run_in_background`), and the wait starts with it. It stops when the editor stops; after `stop`, the next `open`",
|
|
113
|
+
"starts it again.",
|
|
114
|
+
...skill.commentsBy === "mention" ? ["", "When you first give the link, tell the user that a comment with `@agent` in it reaches you (type `@` and pick agent)."] : [],
|
|
115
|
+
...skill.requests ? [
|
|
116
|
+
"",
|
|
117
|
+
"The page's buttons reach you the same way: a request one of them sends arrives as such a message, under",
|
|
118
|
+
"`requests` (its words in `text`, the button in `label`). Those are the user's words, as if typed here: handle",
|
|
119
|
+
"them as this skill says for those words."
|
|
120
|
+
] : []
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
return lines.join("\n");
|
|
124
|
+
}
|
|
125
|
+
function skillBody(raw, path) {
|
|
126
|
+
const frontmatter = /^---\r?\n[\s\S]*?\r?\n---(?:\r?\n|$)/u.exec(raw);
|
|
127
|
+
if (frontmatter === null) throw new Error(`${PLUGIN.name}: ${path} has no YAML frontmatter`);
|
|
128
|
+
return raw.slice(frontmatter[0].length).trim();
|
|
129
|
+
}
|
|
130
|
+
function apply(ctx, config = {}) {
|
|
131
|
+
const node = resolveNode(PLUGIN.name, config ?? {});
|
|
132
|
+
const skills = new Map(PLUGIN.skills.map((skill) => [skill.name, skill]));
|
|
133
|
+
const candidates = PLUGIN.skills.map(({ name: skillName, description }) => {
|
|
134
|
+
const directory = join2(packageRoot, "skills", skillName);
|
|
135
|
+
const path = join2(directory, "SKILL.md");
|
|
136
|
+
if (!isFile(path)) throw new Error(`${PLUGIN.name}: ${path} is missing`);
|
|
137
|
+
return {
|
|
138
|
+
name: skillName,
|
|
139
|
+
description,
|
|
140
|
+
invocation: { modelInvocable: true, userInvocable: true },
|
|
141
|
+
provider: PLUGIN.provider,
|
|
142
|
+
source: "bundled",
|
|
143
|
+
rank: BUNDLED_SKILL_RANK,
|
|
144
|
+
path,
|
|
145
|
+
resourceBase: { kind: "directory", path: directory.split(sep).join("/") }
|
|
146
|
+
};
|
|
147
|
+
});
|
|
148
|
+
const provider = {
|
|
149
|
+
name: PLUGIN.provider,
|
|
150
|
+
list: () => Promise.resolve(candidates),
|
|
151
|
+
async get(candidate, options) {
|
|
152
|
+
const { rank: _rank, ...summary } = candidate;
|
|
153
|
+
const skill = skills.get(candidate.name);
|
|
154
|
+
if (skill === void 0) throw new Error(`${PLUGIN.name}: no skill named ${candidate.name}`);
|
|
155
|
+
const raw = await readFile(candidate.path, { encoding: "utf8", signal: options?.signal });
|
|
156
|
+
const directory = dirname2(candidate.path);
|
|
157
|
+
return { ...summary, content: skillBody(raw, candidate.path) + runtimeSection(skill, directory, node, process.platform, hostRunning()) };
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
ctx.skills.registerProvider(() => provider);
|
|
161
|
+
}
|
|
162
|
+
export {
|
|
163
|
+
apply,
|
|
164
|
+
inject,
|
|
165
|
+
name,
|
|
166
|
+
runtimeSection
|
|
167
|
+
};
|
package/locale/en.json
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"meta": {
|
|
3
|
+
"title": "Claude Data",
|
|
4
|
+
"description": "Adds the claude-data skill: the agent builds data-backed dashboards (charts, numbers and tables over your data files) and opens them in a local dashboard editor whose Sources panel shows where every number comes from, and where you can send comments to the agent.",
|
|
5
|
+
"detail": "docs/DETAIL.md"
|
|
6
|
+
}
|
|
7
|
+
}
|
package/locale/zh.json
ADDED
package/package.json
CHANGED
|
@@ -1,6 +1,106 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-claude-data",
|
|
3
|
-
"version": "
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "2.14.0",
|
|
4
|
+
"description": "DeepSeek Harness plugin: the claude-data skill from baoyu-design. The agent builds data-backed dashboards as files and opens them in a local dashboard editor.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"dsh",
|
|
7
|
+
"dsh-plugin",
|
|
8
|
+
"deepseek-harness",
|
|
9
|
+
"skill",
|
|
10
|
+
"dashboard",
|
|
11
|
+
"data-visualization",
|
|
12
|
+
"charts"
|
|
13
|
+
],
|
|
14
|
+
"homepage": "https://github.com/JimLiu/baoyu-design",
|
|
15
|
+
"repository": {
|
|
16
|
+
"type": "git",
|
|
17
|
+
"url": "git+https://github.com/JimLiu/baoyu-design.git",
|
|
18
|
+
"directory": "dsh-plugins/dsh-claude-data"
|
|
19
|
+
},
|
|
20
|
+
"license": "SEE LICENSE IN LICENSE",
|
|
21
|
+
"author": "Jim Liu 宝玉",
|
|
22
|
+
"type": "module",
|
|
23
|
+
"main": "lib/index.js",
|
|
24
|
+
"icon": "./icon.svg",
|
|
25
|
+
"baoyuDesign": {
|
|
26
|
+
"releaseNotes": [
|
|
27
|
+
{
|
|
28
|
+
"version": "2.14.0",
|
|
29
|
+
"date": "2026-11-11",
|
|
30
|
+
"en": "### Features\n- **`claude-dashboard` is now `claude-data`.** claude.ai renamed the type to Data, and the skill, its DeepSeek Harness plugin (`dsh-claude-data`) and its ChatGPT and Codex plugin (**Baoyu Data**) follow. Call it as `/claude-data` (`$claude-data` in Codex). A dashboard made with `claude-dashboard` opens in `claude-data` as it is, with the same folder; its address is now `/data/<id>/` instead of `/dashboard/<id>/`. `dsh-claude-dashboard` and **Baoyu Dashboard** get no more updates: install `dsh-claude-data` (the **Artifacts** page offers it as a **Not installed** tile) or **Baoyu Data**, then remove the old one. On the Artifacts page, dashboards opened before the rename are listed with the new kind and still open, and comments sent from a dashboard reach the agent through `dsh-claude-data` (the copy of `dsh-claude-data` put on npm on its own before this release lacked both, because the Host plugin it came with did not know the new name).\n- **`claude-data` follows claude.ai's 2026-11-10 update.** A dashboard's toolbar now has a **Design** button. It shows the look in use and a new **Style** section: chart colors, page color, font, corners and text size. A change shows on the page at once and is kept with **Save**; **Reset all** goes back to the defaults. A dataset can be a text file (`format: \"text\"`), which the page turns into rows with a loader. `dash/meta` takes the page's language (`lang`). `check` also reports what the open page found when it checked itself (`pageCheck`: passed, failed with what went wrong, or still loading) beside the page's `runs`.\n- **`claude-design` follows claude.ai's 2026-11-10 update.** Pen, Line and Arrow have a **Drawing options** bar: four stroke weights, and solid, dashed or dotted lines. An artboard's export menu has **All artboards (.png)**, a zip with one PNG per artboard on the page. When the canvas's saved layout is damaged, the canvas turns read-only with a banner and an **Ask the agent to fix** button, and comes back on its own once the file is fixed. A new reference, `shaders.md`, is how the agent makes a shader artboard (WebGL, or anything that moves like light, water, smoke or liquid).\n\n### Fixes\n- `claude-design`: artboards ran React's development build (1.1 MB), which printed warnings such as `Invalid DOM property vector-effect` for drawn lines. They now run the production build (354 KB).\n- `claude-design`: when two tabs changed the same artboard and you chose **Keep both**, the copy was put 80 px right of the original, where it could cover another artboard. It now goes in the first free spot right of that row.\n- In every editor, Escape pressed while the keyboard is in the comments layer (on the comments button, say) now ends comment mode, as it does on the page.\n\n### Documentation\n- `claude-data`'s `SKILL.md` and reference follow the same update: what runs where (each reader's browser loads the datasets, and Sources shows where every number came from), what a page's code may write and when, and how `check` and `runs` report a page that went wrong.",
|
|
31
|
+
"zh": "### 新功能\n- **`claude-dashboard` 改名为 `claude-data`。** claude.ai 把这个类型改名为 Data,技能、它的 DeepSeek Harness 插件(`dsh-claude-data`)和 ChatGPT、Codex 插件(**Baoyu Data**)都跟着改名。调用名是 `/claude-data`(Codex 里是 `$claude-data`)。用 `claude-dashboard` 做的仪表盘,原样用 `claude-data` 打开,文件夹不变;地址从 `/dashboard/<id>/` 变成 `/data/<id>/`。`dsh-claude-dashboard` 和 **Baoyu Dashboard** 不再更新:装上 `dsh-claude-data`(**Artifacts** 页面上它是一个 **Not installed** 的卡片,点开就能装)或 **Baoyu Data**,再把旧的删掉。改名前打开过的仪表盘,在 Artifacts 页面上按新的类型列出,照样能打开;仪表盘上发出的评论经 `dsh-claude-data` 交给 Agent(这一版之前单独发到 npm 的 `dsh-claude-data` 这两样都不行,因为和它配套的 Host 插件还不认识新名字)。\n- **`claude-data` 跟上了 claude.ai 2026-11-10 的更新。** 仪表盘的工具栏多了一个 **Design** 按钮,里面是当前的外观和新的 **Style** 一段:图表配色、页面底色、字体、圆角和字号。改了页面马上显示,点 **Save** 保存;**Reset all** 回到默认。数据集可以是文本文件(`format: \"text\"`),由页面用 loader 拆成行。`dash/meta` 可以写页面的语言(`lang`)。`check` 还会报告打开着的页面自查的结果(`pageCheck`:通过、没通过和出了什么问题、还在加载),和页面的 `runs` 放在一起。\n- **`claude-design` 跟上了 claude.ai 2026-11-10 的更新。** 画笔、直线和箭头有了 **Drawing options** 条:四档粗细,实线、虚线或点线。画板的导出菜单里多了 **All artboards (.png)**,把这一页每块画板各导出一张 PNG,打成一个 zip。画布保存的布局文件坏了时,画布变成只读,顶上有横幅和 **Ask the agent to fix** 按钮,文件修好后自己恢复。新增 reference `shaders.md`,Agent 照它做着色器画板(WebGL,或者像光、水、烟、液体那样流动的效果)。\n\n### 修复\n- `claude-design`:画板里跑的是 React 的开发版(1.1 MB),画的线会报 `Invalid DOM property vector-effect` 这类警告。现在是生产版(354 KB)。\n- `claude-design`:两个标签页改了同一块画板、选 **Keep both** 时,副本放在原画板右边 80 px,可能压住那里的另一块画板。现在放在这一行右边第一个空位。\n- 所有编辑器:键盘在评论层里时(比如停在评论按钮上)按 Escape,现在会退出评论模式,和在页面上按一样。\n\n### 文档\n- `claude-data` 的 `SKILL.md` 和 reference 也跟着这次更新:什么在哪里运行(每个读者的浏览器加载数据集,Sources 说明每个数字从哪里来),页面的代码什么时候可以写入、能写什么,以及 `check` 和 `runs` 怎样报告出错的页面。"
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"version": "2.13.0",
|
|
35
|
+
"date": "2026-11-10",
|
|
36
|
+
"en": "### Features\n- **Whiteboard is released.** `claude-whiteboard` lays out thinking on a board: a diagram, a flow, a map of ideas, a plan, a comparison or a drawn explanation. The agent writes it as elements (sections, blocks joined by arrows, text, tables, sticky notes, drawings and small working embeds) into the board's own store, and you watch them land in the local board editor. There you move and resize things, type, draw with the pen, and add sections, sticky notes, shapes and stickers from the toolbar, and the agent sees what you changed. Comment on an item, a spot or an area and send it to the agent, which changes the board and replies. **Share** opens the board to your local network with a link per role, everyone on a link sees the others' cursors and changes live, and its Export tab downloads the whole folder as a zip. **History** lists the versions. One server serves every board on the computer. Needs Node 22+. The board's own assistant on claude.ai (the Ask box, cursor chat, read-aloud and dictation) is not available locally; ask the agent in your conversation instead.\n- DeepSeek Harness: the new `dsh-claude-whiteboard` plugin. Comments sent from a board reach the agent, and boards are listed on the **Artifacts** page with a picture of the board, where they can be renamed like the other kinds.\n- ChatGPT and Codex: the new **Baoyu Whiteboard** plugin in the baoyu-design marketplace.",
|
|
37
|
+
"zh": "### 新功能\n- **白板正式发布。** `claude-whiteboard` 把想法摆在白板上:示意图、流程、想法地图、计划、对比或手绘的讲解。Agent 把它写成一个个元素(分区、用箭头连起来的方块、文字、表格、便签、手绘图和能操作的小嵌入),存进白板自己的存储,你在本地白板编辑器里看着它们一个个出现。你可以拖动、缩放、打字、用画笔画,从工具栏加分区、便签、形状和贴纸,你改了什么 Agent 也看得到。对一个元素、一个位置或一块区域留评论发给 Agent,它改好白板再回复你。**Share** 把白板开放到局域网,每种角色一个链接,拿到链接的人能实时看到彼此的光标和改动,它的 Export 页可以把整个文件夹下载成 zip。**History** 列出各个版本。这台电脑上的所有白板共用一个服务器。需要 Node 22+。claude.ai 上白板自带的助手(Ask 输入框、光标聊天、朗读和听写)在本地用不了,在对话里问 Agent 就好。\n- DeepSeek Harness:新增 `dsh-claude-whiteboard` 插件。白板上发出的评论会交给 Agent,白板也列在 **Artifacts** 页面上,带白板的缩略图,可以像其他类型一样改名。\n- ChatGPT 和 Codex:baoyu-design 插件市场新增 **Baoyu Whiteboard** 插件。"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"version": "2.12.3",
|
|
41
|
+
"date": "2026-11-10",
|
|
42
|
+
"en": "### Fixes\n- **`claude-design`: `check` now catches a canvas title placed too close above its row.** An artboard's name strip keeps its size on screen while a title (`title1`) scales with the canvas, so a title 140 px above its row looked fine at 100% but covered the artboards' names once zoomed out below about 50%. `SKILL.md` already asked for at least 223 px. `check` now reports a title of 72 px or more that is closer than that to the artboards under it, or that sits over one: one issue per title, with the `y` to move it to. Text the user adds with the editor's text tool is left alone, wherever it is (contributed by @congee949, [#38](https://github.com/JimLiu/baoyu-design/pull/38)).",
|
|
43
|
+
"zh": "### 修复\n- **`claude-design`:`check` 现在会查出离画板太近的画布标题。** 画板的名称条在屏幕上大小不变,标题(`title1`)却跟着画布缩放,所以标题放在一行画板上方 140 px,100% 时看着没问题,缩到 50% 以下就压住了画板的名字。`SKILL.md` 本来就要求至少 223 px;现在 72 px 及以上的标题离下面的画板不到这个距离,或者压在画板上,`check` 都会报出来,每个标题一条,并给出要挪到的 `y`。用户用编辑器文字工具加的文字,放在哪里都不查(@congee949 贡献,[#38](https://github.com/JimLiu/baoyu-design/pull/38))。"
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"version": "2.12.2",
|
|
47
|
+
"date": "2026-11-09",
|
|
48
|
+
"en": "### Features\n- **`claude-design`: Export → HTML for Figma.** Capturing the canvas, or the Standalone web page, with Figma's Chrome extension brought the artboards in as empty boxes, because each artboard is drawn inside a frame the extension does not look into. **HTML for Figma** (in the toolbar's Export, an artboard's Export and the Share panel's Export tab) saves `<title>.figma.html`: every artboard's rendered layers, placed where they are on the canvas, with their styles, fonts and images inside the file, and no frames and no scripts. Open it in Chrome and capture it with Figma's extension (**Capture page**, or **Select element** for one artboard). In an artboard's own Export it is that artboard alone. `SKILL.md` tells the agent how to answer when asked to bring a design into Figma (reported by @mufanmu, [#36](https://github.com/JimLiu/baoyu-design/issues/36)).\n\n### Fixes\n- **`claude-design`: PNG export no longer draws some icons as black or solid blocks.** An SVG icon drawn with `<use>` lost the `fill: none` and `stroke: currentColor` its class gave it, and came out filled in black; it now takes the colour of the `<use>`. An icon cut out with a CSS `mask-image` (on an element or on `::before` and `::after`) was drawn as a solid block because the mask's file was not in the exported image; masks are now embedded like background images (reported by @hh0592821, [#35](https://github.com/JimLiu/baoyu-design/issues/35)).\n- **`share` gives out the Wi-Fi's address first on a computer with a VPN, a proxy or a hotspot.** On Windows the links could start with the address of a proxy's virtual adapter (a sing-box TUN named `falemon-tun`, `172.19.0.1`), which nobody else on the network can reach. Addresses of adapters named like a tunnel (`falemon-tun`, OpenVPN's TAP, Wintun, anything with `vpn` in its name), of point-to-point links, and of networks this computer makes itself (the Mobile Hotspot's `192.168.137.1`, a virtual machine's or container's network) now come after the local network's. When a computer is on more than one network, `share` says that a link that does not open can be tried with another of the listed addresses (reported by @Bistard, [#37](https://github.com/JimLiu/baoyu-design/issues/37)).\n- **`open` no longer says the port is in use when a firewall or proxy filters `::1`.** A probe refused with `EACCES` or `EPERM` counted as an answer from something on the port, so `open` gave up on all 100 ports it tries.\n- A page whose skill folder was moved, renamed or removed while its server ran now says so, and names the folder to the owner, instead of telling them to reinstall the skill. A guest is told to ask whoever shared it.",
|
|
49
|
+
"zh": "### 新功能\n- **`claude-design`:新增 Export → HTML for Figma。** 以前用 Figma 的 Chrome 扩展捕捉画布,或捕捉导出的 Standalone web page,画板进到 Figma 里都是空框,因为每个画板都画在一个框架(iframe)里,扩展看不进去。现在工具栏的 Export、画板自己的 Export 和 Share 面板的 Export 标签里都有 **HTML for Figma**,保存成 `<标题>.figma.html`:每个画板渲染出来的图层,摆在它们在画布上的位置,样式、字体和图片都在文件里,没有框架,也没有脚本。用 Chrome 打开这个文件,再用 Figma 的扩展捕捉(**Capture page**,只要一个画板就用 **Select element**)。画板自己的 Export 里,导出的只是这一个画板。`SKILL.md` 也写了用户要把设计带进 Figma 时 Agent 该怎么答(@mufanmu 报告,[#36](https://github.com/JimLiu/baoyu-design/issues/36))。\n\n### 修复\n- **`claude-design`:PNG 导出不再把一部分图标画成黑色或实心块。** 用 `<use>` 画的 SVG 图标,会丢掉 class 给它的 `fill: none` 和 `stroke: currentColor`,导出来被涂成黑色,现在按 `<use>` 的颜色走。用 CSS `mask-image` 抠出来的图标(元素上的,或 `::before`、`::after` 上的)因为遮罩文件没进导出的图片,被画成一整块实心,现在遮罩像背景图一样嵌进去(@hh0592821 报告,[#35](https://github.com/JimLiu/baoyu-design/issues/35))。\n- **装了 VPN、代理或开了热点的电脑上,`share` 先给出 Wi-Fi 的地址。** 在 Windows 上,链接可能以代理虚拟网卡的地址开头(sing-box 的 TUN,叫 `falemon-tun`,`172.19.0.1`),网络上的其他人连不上。现在名字像隧道的网卡(`falemon-tun`、OpenVPN 的 TAP、Wintun、名字里带 `vpn` 的),点对点链路,以及这台电脑自己建的网络(移动热点的 `192.168.137.1`、虚拟机或容器的网络),地址都排在本地网络后面。电脑在多个网络上时,`share` 会提示:链接打不开,可以把地址换成列出的另一个再试(@Bistard 报告,[#37](https://github.com/JimLiu/baoyu-design/issues/37))。\n- **防火墙或代理拦着 `::1` 时,`open` 不再报端口被占用。** 探测被 `EACCES` 或 `EPERM` 拒绝,以前算成端口上有东西应答,`open` 试的 100 个端口全部放弃。\n- 技能文件夹在服务器运行期间被移动、改名或删除,页面现在会说明这一点,并把文件夹告诉主人,而不是让他重装技能;访客看到的是请分享的人重新打开。"
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"version": "2.12.1",
|
|
53
|
+
"date": "2026-11-07",
|
|
54
|
+
"en": "### Fixes\n- **A long comment thread no longer runs off the bottom of the window.** The open card used to have no height limit, so the last replies and the reply box could be out of reach. In every editor it now stops at 60% of the window (never under 320px, and never taller than the room on the side it opens toward). The comments scroll inside it and the reply box stays below. After you reply, the thread follows to your reply; a long reply from the agent lines up at its top, and scrolling up stops the following (reported by @congee949, [#34](https://github.com/JimLiu/baoyu-design/issues/34)).\n- **`claude-design` and `claude-slides` opened on their own now keep the address bar on where you are.** Under `open` or DeepSeek Harness's browser there is no claude.ai frame to do it, so switching pages or slides left the address as it was, a pasted `#page-…` or `#slide-…` link did nothing once the page had loaded, and **Copy link to page** and **Copy link to slide** could not copy. In `claude-design` the address now names the page, switching to another page adds a history entry (up to 20), and Back and Forward move between them. In `claude-slides` the address follows the current slide without filling the history. Both follow a changed address to its place, and the copy shortcuts copy the page's address with the place in it and say **Link copied.** On claude.ai nothing changes. This is the address part of [#33](https://github.com/JimLiu/baoyu-design/issues/33), reported by @congee949; the previous/next page buttons and page keys it asks for are not in this release.",
|
|
55
|
+
"zh": "### 修复\n- **很长的评论串不再顶出窗口下沿。** 以前打开的评论卡片没有高度上限,最后几条回复和回复框可能够不到。现在所有编辑器里,卡片最高是窗口的 60%(不低于 320px,也不超过它朝向那一侧的空间),评论在卡片里滚动,回复框固定在下面。你回复之后,评论串会跟到你的回复;Agent 的长回复从它的开头对齐,往上滚就不再跟随(@congee949 报告,[#34](https://github.com/JimLiu/baoyu-design/issues/34))。\n- **单独打开的 `claude-design` 和 `claude-slides`,地址栏现在会跟着你所在的位置。** 用 `open` 或在 DeepSeek Harness 的浏览器里打开时,没有 claude.ai 的外层框架来做这件事:切页或切幻灯片,地址栏不变;贴一个 `#page-…` 或 `#slide-…` 的链接,页面加载之后没有反应;**Copy link to page**、**Copy link to slide** 复制不了。现在 `claude-design` 的地址栏写的是当前页,切到另一页会多一条历史记录(最多 20 条),后退、前进能在页之间来回;`claude-slides` 的地址栏跟着当前幻灯片走,但不往历史里添记录。地址被改成另一个位置时,两者都会跟过去;复制快捷键复制的是带着位置的本页地址,并提示 **Link copied.**。在 claude.ai 上没有变化。这是 [#33](https://github.com/JimLiu/baoyu-design/issues/33)(@congee949 报告)里地址栏的那部分,它要的上一页/下一页按钮和切页快捷键这个版本没有做。"
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"version": "2.12.0",
|
|
59
|
+
"date": "2026-11-06",
|
|
60
|
+
"en": "### Features\n- **Comments, in every editor, follow claude.ai's comment layer more closely.** A thread whose pin is out of the window gets a **More comments** tab with its count at that edge instead of a pin, and a click opens the nearest one. Pins on the same spot sit side by side. The **All comments** panel has **Send all to Agent**, which gives the agent every thread at once (`comments --wait` returns them together). An edited message says **edited**, a resolved thread says **Reply to reopen…**, and the panel has an empty state and, when the filter hides everything, **Show N resolved**.\n- **`claude-slides`, `claude-design`, `claude-design-system`, `claude-dashboard` and `claude-motion` follow claude.ai's 2026-11-05 update.** In all five: a button shows that it is working while its action runs, a dialog gives focus back to where it was, toasts can be reached from the keyboard, tabs have an underline style, and the icon set has 34 more icons. Properties can be copied and pasted in slides, design and the dashboard's edit mode.\n- `claude-slides`: speaker notes can be edited in the Canvas view, and the presentation has jump keys (Home, End).\n- `claude-design`: grid cells can be dragged and moved with the keyboard, and a tall artboard's PDF export is split across pages.\n- `claude-design-system`: a system holds up to 4,096 files a version, 4,080 of them its own (1,024 before), and `agent.md` and `gemini.md` are refused as file names, like `claude.md` and `agents.md`.\n- `claude-dashboard`: an attached file can be up to 15 MiB, a document written by the agent carries an `edit` stamp the page reads, and `check` knows the new rules for `dash/look`.\n- `claude-motion`: `check` warns about a module named `scene-…` or `layer-…`, which are the player's own names.\n\n### Documentation\n- Every editor's `SKILL.md` and reference follow the same update. `claude-slides` and `claude-design` choose typefaces from the brief and the subject, Inter with Space Grotesk when it is neutral. `claude-dashboard` has new looks and questions pages and reworked pages on data sources, features, design systems and reading aloud.\n- `claude-motion` is reworked: a new film is asked about before anything is made, a film left half-way is taken up again on a later turn instead of started over, a named design system is read before the first scene, and a few kinds of film are refused (for or against a political party, candidate or ballot measure; a promo for gambling or a crypto coin, token or exchange; a fight or combat scene). New reference pages cover each.",
|
|
61
|
+
"zh": "### 新功能\n- **所有编辑器的评论层更接近 claude.ai 的评论层。** 图钉不在窗口里的评论,不再画图钉,改成在那一侧边缘贴一个带数量的 **More comments** 标签,点一下就打开离得最近的一条。同一个位置的图钉并排排开。**All comments** 面板里有 **Send all to Agent**,一次把所有评论串发给 Agent(`comments --wait` 一起返回)。改过的消息会标 **edited**,已解决的评论串显示 **Reply to reopen…**,面板有了空状态;筛选把评论全藏起来时,显示 **Show N resolved**。\n- **`claude-slides`、`claude-design`、`claude-design-system`、`claude-dashboard` 和 `claude-motion` 跟上了 claude.ai 2026-11-05 的更新。** 五个编辑器都有:按钮在操作进行时显示忙的状态,对话框关闭后把焦点还给原来的位置,提示条可以用键盘切过去,标签页多了下划线样式,图标多了 34 个。幻灯片、设计稿和仪表盘的编辑模式里可以复制、粘贴属性。\n- `claude-slides`:演讲者备注可以在 Canvas 视图里直接编辑,演示时多了跳转键(Home、End)。\n- `claude-design`:网格的单元格可以拖动,也可以用键盘移动;很高的画板导出 PDF 时拆成多页。\n- `claude-design-system`:一个设计系统每个版本最多 4,096 个文件,其中自己的 4,080 个(以前是 1,024);`agent.md` 和 `gemini.md` 和 `claude.md`、`agents.md` 一样,不能用作文件名。\n- `claude-dashboard`:附件最大 15 MiB;Agent 写的文档带 `edit` 戳,页面会读它;`check` 认识 `dash/look` 的新规则。\n- `claude-motion`:`check` 对名字以 `scene-` 或 `layer-` 开头的模块给出警告,这两类是播放器自己的名字。\n\n### 文档\n- 每个编辑器的 `SKILL.md` 和 reference 都跟着这次更新。`claude-slides` 和 `claude-design` 按需求和主题选字体,中性的就用 Inter 搭 Space Grotesk。`claude-dashboard` 新增了 looks 和 questions 两页,数据来源、功能、设计系统和朗读几页重写了。\n- `claude-motion` 重写:新片先问再做,做到一半的影片下一轮会接着做,不重来;指定了设计系统,先读它再画第一场;还有几类片子不做(支持或反对某个政党、公职候选人或公投议案;赌博、加密币、代币或交易所的宣传片;打斗或战斗场面)。各有新的 reference 页。"
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"version": "2.11.1",
|
|
65
|
+
"date": "2026-11-05",
|
|
66
|
+
"en": "### Features\n- **DeepSeek Harness: the Artifacts page offers the plugins you haven't installed.** Beside the tiles for the skills you have, each other baoyu-design plugin gets a dimmed tile marked **Not installed**. Click it to see what the plugin makes and install it from there, at the same version as the ones you have, usually without a restart. Once it's in, **Start** opens a session with the skill. In an app that can't install from the page, the tile points you to the Plugins page. A plugin you installed and switched off still gets no tile.\n\n### Fixes\n- With `--agent-hook`, a comment could reach the agent twice: a second send could start the hook again after the first run had finished but before the comment was marked sent.",
|
|
67
|
+
"zh": "### 新功能\n- **DeepSeek Harness:「作品」页会列出你还没装的插件。** 已装技能的入口旁边,其他 baoyu-design 插件也各有一个入口,颜色淡一些,标着 **未安装**。点开会说明这个插件做什么,可以直接在这里安装,版本和你已装的一致,多数情况不用重启。装好后点 **新建** 就用这个技能开一个会话。应用不支持在页面里安装时,会引导你去插件页。装了但被你关掉的插件,仍然没有入口。\n\n### 修复\n- 用 `--agent-hook` 时,一条评论可能发给 agent 两次:第一次运行已经结束、评论还没标成已发送时,第二次发送会再启动一次 hook。"
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"version": "2.11.0",
|
|
71
|
+
"date": "2026-11-05",
|
|
72
|
+
"en": "### Features\n- **DeepSeek Harness: a new version no longer pops up over the app.** The **Artifacts** row in the left sidebar gets an **Update** label instead (a dot on the icon, where a collapsed sidebar keeps its icons), and a panel at the top of the Artifacts page shows the versions, each plugin and what the release changes. **Update all** updates them together; **Update** on a plugin's line takes just that one. **Later** folds the panel to one line and removes the label until the next version.\n- While an update runs you can leave the Artifacts page: the label says **Updating**, **Failed** or **Restart**. **Try again** picks up where it stopped: the rest after **Update all**, that plugin after its own **Update**.\n- The **Update** button on a plugin's page now updates only that plugin, and a page that was open when its plugin was replaced comes back by itself.",
|
|
73
|
+
"zh": "### 新功能\n- **DeepSeek Harness:新版本不再弹出来打断你。** 左侧栏的 **Artifacts**(「作品」)这一行会多一个 **更新** 标签(侧栏收起后还留着图标的话,是图标上的小圆点),「作品」页顶部的面板写着版本、每个插件和这次改了什么。**全部更新** 一起更新;每个插件那一行的 **更新** 只更新它自己。**稍后** 把面板收成一行,标签也消失,等下一个版本再提示。\n- 更新时可以离开「作品」页:标签会显示 **更新中**、**更新失败** 或 **待重启**。**重试** 从停下的地方接着来:**全部更新** 失败就接着更新剩下的,单独更新失败就再试这一个。\n- 插件详情页的 **更新** 按钮现在只更新这一个插件;更新时开着的页面被替换后,会自己回来。"
|
|
74
|
+
}
|
|
75
|
+
]
|
|
76
|
+
},
|
|
77
|
+
"exports": {
|
|
78
|
+
".": "./lib/index.js",
|
|
79
|
+
"./cordis.patch.yml": "./cordis.patch.yml",
|
|
80
|
+
"./locale/*.json": "./locale/*.json",
|
|
81
|
+
"./package.json": "./package.json"
|
|
82
|
+
},
|
|
83
|
+
"files": [
|
|
84
|
+
"lib",
|
|
85
|
+
"locale/*.json",
|
|
86
|
+
"docs",
|
|
87
|
+
"skills",
|
|
88
|
+
"cordis.patch.yml",
|
|
89
|
+
"icon.svg",
|
|
90
|
+
"README.md",
|
|
91
|
+
"LICENSE",
|
|
92
|
+
"NOTICE.md"
|
|
93
|
+
],
|
|
94
|
+
"engines": {
|
|
95
|
+
"node": ">=20",
|
|
96
|
+
"dsh": ">=0.2.0-0"
|
|
97
|
+
},
|
|
98
|
+
"dependencies": {
|
|
99
|
+
"dsh-claude-artifacts": "^2.14.0"
|
|
100
|
+
},
|
|
101
|
+
"dsh": {
|
|
102
|
+
"bundle": {
|
|
103
|
+
"patch": "./cordis.patch.yml"
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|