npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

dsh-image-creator

v0.4.0

Published

GPT-Image2 提示词画廊 — DeepSeek Harness web client plugin: a floating gallery over the awesome-gpt-image-2 dataset, with search, category/style/scene filters, AI semantic search via the session's LLM, zh/en prompt toggle, and one-click local image generation

Readme

dsh-image-creator

GPT-Image2 提示词画廊 — DeepSeek Harness web 客户端插件。仿 gpt-image2.canghe.ai 的呈现形式,把 awesome-gpt-image-2 数据集(src/awesome-gpt-image-2/data 下的 cases.json + images/)渲染成一个悬浮在 DSH 页面上方的画廊层:半透明遮罩 + 居中面板(自带 sticky 顶栏,面板整体滚动),原页面在面板四周保持可见,点遮罩或 Esc 关闭。

功能

  • Hero 指标:529 案例 / 13 分类 / 22 模板,GitHub 与原站入口
  • 精选条:featured 案例横滑(点图进预览)
  • 筛选:全文搜索(标题/Prompt/来源/标签)+ 分类/风格/场景下拉 + 分类 chips(带计数)
  • 案例网格:懒加载图片、Prompt 预览、标签、GitHub 溯源;分页渐进渲染(每页 48)
  • 试一试(生图):卡片/预览的「⚡ 试一试」打开生成面板 — 左侧可编辑提示词 + 生成按钮,右侧展示结果;后台串行执行 ollama run draw <提示词>(5 分钟超时),CLI 输出按 整体 base64 / 内嵌 base64 段 / 图片文件路径 三种方式解析;每个案例最近一次结果缓存在浏览器(最多 12 条)
  • 中文翻译:数据优先读取 cases_with_trans.json(缺失自动回退 cases.json);试一试面板「中文」按钮在 英文原文 ↔ 中文翻译 间切换,两边都可编辑,生成使用当前显示文本;无翻译的案例按钮禁用并提示
  • 环境自检(ollama + draw):宿主端启动即探测本机 ollama(127.0.0.1:11434,OLLAMA_HOST 可覆盖)与 draw 模型;模型缺失时自动后台执行 ollama pull x/z-image-turbocp 改名为 drawrm 清理中间标签;「试一试」仅在环境就绪时进入生成面板,未就绪时点击弹出引导(安装/启动 ollama + 一键下载 draw,含进度条与日志尾)
  • AI 语义筛选(✨ AI):搜索框输入任意描述(中英文皆可),点「✨ AI」按钮 → 宿主端把 529 个案例压成一行一案的目录(id/标题/分类/标签/Prompt 预览)交给 dsh 的 llm 服务(ctx.llm.stream),模型按语义相关性返回排序后的案例 id(最多 24 条);模型优先用当前活动会话正在使用的模型(经 /api/session.list 最新会话 → /api/session.models 当前选择解析,30s 缓存,GUI 里切模型即时跟随),其次行配置 llmProvider/llmModel,最后第一个 provider;结果横幅 + 排名顺序渲染(显示所用模型与来源),分类/风格/场景筛选可叠加;编辑搜索词或点「✕ 清除」退出;查询结果缓存(最近 32 条,忽略大小写)
  • 大图预览:完整 Prompt(可滚动/复制)、来源链接、←/→ 键在筛选结果中翻页、Esc 关闭
  • 模板区:22 套工业级模板卡片(useWhen / guidance / 防坑清单可展开 / exampleCases 点击直达案例 / GitHub 文档锚点)

数据路由(宿主半边 index.js

| 路由 | 内容 | |---|---| | GET /image-gallery/ | 索引 JSON | | GET /image-gallery/cases.json | 529 条案例 | | GET /image-gallery/style-library.json | 分类法 + 模板 | | GET /image-gallery/images/* | 案例图与分类封面(immutable 缓存) | | GET /image-gallery/cases_with_trans.json | 带翻译数据集(每案例 prompt_zh),由翻译脚本生成 | | POST /image-gallery/generate | {prompt, caseId} → 串行调用 ollama run draw,返回 {ok, image: dataURL} | | GET /image-gallery/ollama-status | 探测 ollama 运行状态 + draw 模型是否就绪 + 后台下载进度(4s 缓存) | | POST /image-gallery/ollama-ensure | 触发 draw 模型准备(幂等:已就绪直接返回;缺 ollama 返回 need:ollama);同源校验 | | POST /image-gallery/smart-search | {query} → dsh llm 语义排序(活动会话模型优先),返回 {ok, ids[≤24], provider, model, routeSource};同源校验;90s 超时;查询缓存 | | GET /image-gallery/data-status | 数据集供给进度(phase/received/total/files/error;npm 安装首运行下载用) | | POST /image-gallery/data-ensure | 触发/重试数据集下载(幂等;同源校验) |

数据根默认 <pluginRoot>/src/awesome-gpt-image-2/data;可在 profile patch 里用 dataRoot 覆盖(相对插件包解析)。AI 筛选模型优先级:当前活动会话的选择 > 行配置 llmProvider + llmModel > 第一个 provider 及其第一个模型。已做目录穿越防护与扩展名白名单。

批量翻译(生成 cases_with_trans.json)

node scripts/translate-cases.mjs                       # 全量(断点续跑,可 Ctrl-C 中断)
node scripts/translate-cases.mjs --limit 5             # 先试 5 条
node scripts/translate-cases.mjs --only 373,17         # 指定案例
node scripts/translate-cases.mjs --model ornith-1.5:35b --ctx 8192

通过本机 ollama(默认 http://127.0.0.1:11434)把每个案例的英文 Prompt 批量翻译成简体中文,写入 src/awesome-gpt-image-2/data/cases_with_trans.json(原信封不变,每案例新增 prompt_zh)。特性:断点续跑(已翻译跳过)、每 5 条增量落盘、Ctrl-C 安全退出、原子写(tmp+rename)、健全性校验(CJK 占比防回显英文)、失败重试 2 次后留给下次。529 条长文本本地推理预计需数小时。注意本机 ollama 对 qwen3.8 报 unknown renderer,需 --model 选可用文本模型(如 ornith-1.5:35b)。

安装

方式一(npm,推荐):

dsh plugin --profile web add dsh-image-creator
# 重启 dsh web 生效(client 模块在启动时扫描)

npm 包只含插件代码(数据集 154MB 不随包发布)。首次打开画廊时宿主端自动从本仓库 GitHub tarball 下载数据集到 ~/.dsh/dsh-image-creator/data(带进度显示,仅此一次;镜像/测试可用环境变量 DSH_IMAGE_CREATOR_DATA_URL 指向同布局 tar.gz)。

方式二(本地 link,开发用):

dsh plugin --profile web add link:/Users/clark/code/dsh-image-creator

侧边栏底部出现「图片画廊」按钮,点击在页面上方浮出居中画廊面板(96vw × 92vh 以内)。面板自身滚动展示全部内容:顶栏与筛选条 sticky 固定,内容区下滚加载。Esc / 点遮罩 / 顶栏 ✕ 关闭,原页面不被替换。

结构

package.json        # dsh.bundle.patch + dsh.client(web 平台,立即注入)
cordis.patch.yml    # profile 层:插入 image-creator 行
index.js            # 宿主半边:webServer 前缀路由(守卫式注册,非 web profile 下空转)
data-provision.js   # 数据集自举:npm 安装首运行从 GitHub tarball 下载解压到 ~/.dsh 缓存(守卫式解压)
client.js           # 浏览器半边:sidebar.footer.action 启动器 + shell.overlay 悬浮画廊层
scripts/translate-cases.mjs  # 独立翻译脚本:cases.json → cases_with_trans.json
src/awesome-gpt-image-2/   # 数据集 data/(cases + style-library + images,取自上游仓库后仅保留数据与 LICENSE)
docs/               # 数据结构逆向文档

构建过程(需求 → 响应概述)

本插件由一次 DSH 会话(session-f8ef3f1c…)驱动构建,下表按时间顺序归档会话中的每一项用户需求与对应的实现响应:

| # | 阶段 | 用户需求 | 响应概述 | |---|---|---|---| | 1 | 逆向分析 | gpt-image2.canghe.ai 的图片内容资产用什么数据结构描述? | 从线上站点 JSON 逆向得出信封结构(529 案例 / 13 分类 / 22 模板,cases.json + style-library.json + images/) | | 2 | 数据考证 | clone 上游仓库 awesome-gpt-image-2,按源码校对出准确完整的数据结构文档 | 产出 docs/awesome-gpt-image-2-data-structures.md,修正多处逆向推测(字段名、枚举、上游生成管线 docs → generate-site-data.mjs → data) | | 3 | 插件雏形 | 搭建 DSH 插件,用 cases.json + images/ 仿站点呈现 | dsh-image-creator:宿主半边静态路由(index.js)+ 客户端画廊层(client.js,搜索/筛选/预览/模板/复制),cordis.patch.yml + package.json 声明,link: 安装进 web profile | | 4 | 悬浮层改造 | 画廊从整页接管改为悬浮在 DSH 页面上方(参照 raiden-arcade),并修复内容不可滚动 | shell.overlay 半透明遮罩 + 居中面板;面板自身为滚动容器(sticky 顶栏/筛选、overscroll-behavior:contain),原页面四周可见,Esc/遮罩关闭 | | 5 | 试一试 | 把「复制 Prompt」换成「试一试」:左侧可编辑提示词 + 生成按钮,右侧生成图,后台执行 ollama run draw | TryPanel 浮层 + POST /generate:服务端串行队列、5 分钟超时、输出三策略解析(整体 base64 / 内嵌 base64 段 / 图片文件路径);每案例最近一次结果缓存在浏览器(≤12 条) | | 6 | 缺陷修复 | 生成报错 Unexpected end of JSON input | 根因:仍在运行的旧宿主半边无 /generate 路由 → 405 空响应体;客户端改为 r.text() + describeFailure 给出人话提示(宿主半边变更需重启 dsh web) | | 7 | 缺陷修复 | 502「未能从 ollama 输出中解析出图片」 | 根因:draw 模型把图写成相对路径文件而非 base64;extractImage 接受相对路径(resolve 到 cwd)、读入内存后删除产物 | | 8 | 中文翻译 | ①独立脚本:cases.json → cases_with_trans.json(每案例 prompt 中文)②插件改读翻译文件 ③试一试面板加「中文」按钮 | scripts/translate-cases.mjs(断点续跑、每 5 条原子落盘、Ctrl-C 安全、CJK 健全性校验防回显、失败重试留待下轮);客户端优先 fetch cases_with_trans.json、404 回退 cases.json;「中文」按钮在 英文原文 ↔ 中文翻译 间切换,两侧均可编辑,生成用当前显示文本 | | 9 | 翻译模型 | translate-cases.mjs 用哪个模型?指定 ornith-1.5:35b(速度快) | 原默认 qwen3.8:huihui 在本机报 unknown renderer 不可用;PREFERRED 首选改为 ornith-1.5:35b,单案例冒烟验证(451 字符 / 24.5s)后启动全量 529 条后台翻译 | | 10 | 缺陷修复 | #532 已翻译,但点「中文」没反应 | 根因:数据集页面加载时被模块级缓存,翻译落盘后内存不更新、按钮处于 disabled;修复:面板打开时若该案例无翻译则 cache-bust 自动补拉并热更新案例对象;按钮常可点,无翻译时点击自动尝试拉取/给出进行中提示 | | 11 | 缺陷修复 | 502,产物文件名以连字符开头(-one-point-color-…png) | 根因:候选清洗把开头连字符当标点修剪 → 与磁盘文件名不匹配;修复:优先按 Image saved to: 整行原样解析(保留原文件名),通用词扫描同时尝试原始/修剪词;清理家目录 7 个遗留孤儿 PNG;宿主半边需重启生效 | | 12 | 安全审计 | 检查本项目是否存在安全漏洞 | 发现并修复 6 项:跨源 CSRF 里程攻击(Sec-Fetch-Site/Origin 同源校验)、生成队列无上限(MAX_PENDING=16)、模型输出可致任意图片读取+删除(候选限 cwd 内相对名)、symlink 逃逸(lstat)、SVG 同源 XSS 载体(CSP + nosniff)、数据集 href 未消毒(safeUrl 仅放行 https);另核查路径穿越/命令注入/请求体 DoS/XSS 文本面/供应链等 8 项无问题;13 项回归测试全过 | | 13 | 目录清理 | src/awesome-gpt-image-2 下只有 data 实际用到,其余删除 | 删 165MB(.git 160MB、上游站点源码/文档/工程文件),保留 data/ + LICENSE(MIT 再分发合规);验证活服务器四路由与翻译任务均不受影响 | | 14 | 环境自检 | 加载时检查本机 ollama 是否启动(未启动则引导下载启动);再查 draw 模型(缺失则 pull x/z-image-turbo 并改名 draw);两者就绪才可用「试一试」,否则点击引导补齐 | 宿主端启动自检(探测 /api/tags,缺 draw 自动后台 pull → cp 改名 → rm 清理,实时进度/日志尾);GET /ollama-status(4s 缓存)+ POST /ollama-ensure(幂等、同源校验);客户端挂载即探测、未就绪每 2.5s 轮询;未就绪点「试一试」弹 GuidePanel:第 1 步装/启 ollama(命令示例 + 重检按钮),第 2 步一键下载 draw(进度条 + 失败重试) | | 15 | AI 语义筛选 | 加模糊查询:用户输入查询内容,用 dsh 的 LLM 从内容 json 匹配最相关内容筛选呈现 | 逆向 dsh 源码定位 llm cordis 服务(ctx.llm.stream,chunk 协议 + 消息形状内联构造,零依赖);POST /smart-search:529 案例压成一行一案目录(id/标题/分类/标签/预览)→ 模型按语义相关性返回排序 id(≤24,容错解析 + 白名单过滤 + 查询缓存);客户端搜索框旁「✨ AI」按钮 → 结果横幅(模型信息)+ 排名顺序渲染,可叠加分类/风格/场景筛选 | | 16 | 路由修正 | 「广告」匹配 0 条(deepseek-official / deepseek-v4-flash);模型不要用默认的,用当前活动 session 的模型 | 双根因:① maxTokens 600 被推理型模型的思考烧光、正文为空 → 提至 4096;② 路由落到配置异常的 provider;模型解析改为优先读活动会话当前选择(经 app 自身 RPC 载体 /api/session.list 最新会话 → /api/session.models current,30s 缓存,GUI 切模型即时跟随)> 行配置 > 第一个 provider;横幅标注「· 当前会话」;0 结果时回显模型原始输出(rawTail)辅助诊断 | | 17 | 发布 | 清理无效无用文件;安全漏洞检查;提交代码到 GitHub 仓库 | 项目本就无残留(复核根目录/docs/scripts);密钥模式全库扫描 0 命中、新代码复查无新增攻击面;补 .gitignore;git init + 571 文件提交并创建 https://github.com/flyingtimes/dsh-image-creator 推送 main | | 18 | 归档 | 把会话中的需求整理成「需求+响应概述」表格加进 README,记录完整构建过程 | 本表 | | 19 | npm 发布 | 翻译全量后提交 GitHub 并打标签;插件发布到 npm(dsh plugin add dsh-image-creator 一键加载) | npm 包仅含代码(47KB/8 文件);数据集 154MB 由 data-provision.js 首运行自举——GitHub tarball(tag 优先、404 回退 main)→ 守卫式解压(拒绝 ../、绝对路径、symlink、AppleDouble)→ ~/.dsh/dsh-image-creator/data 缓存(.version 版本标记,插件升级自动重下);GET /data-status 进度 + POST /data-ensure 重试(同源校验);客户端进度条 + 轮询;真实 tarball 全流程 + 恶意条目 6/6 + HTTP E2E 10/10 验证 |