# dsh-stock-watch

> 在 DSH Web 右上角添加 A 股自选股盯盘弹窗：实时行情、分时/K 线、买卖目标价提醒，并集成扇形 AI 入口一键生成研究与复盘对话。

## Metadata

- Author: [@Awu12277](https://github.com/Awu12277)
- Repo: <https://github.com/Awu12277/dsh-stock-watch.git>
- GitHub: [Awu12277/dsh-stock-watch](https://github.com/Awu12277/dsh-stock-watch)
- Stars: 57
- Language: JavaScript
- License: [MIT](https://spdx.org/licenses/MIT.html)
- Topics: `dsh-plugin`, `dsh-plugin-market`, `dsh-plugins`, `plugin`, `stock`, `stock-market`
- Forks: 5
- Open Issues: 4
- Last push: 2026-08-17T08:22:52.000Z
- Added: 2026-08-20T00:00:00.000Z

## Install

```bash
dsh plugin --profile web add github:Awu12277/dsh-stock-watch
```

## Wiki

## 一句话定位
在 DSH Web 界面的右上角提供可折叠、可拖动的 A 股自选股盯盘弹窗，实时展示自选股涨跌、目标价触发、分时与日/周/月 K 线，并把"一键投资研究""每日复盘/行情分析/涨停分析"等 AI 入口就地接入到 DSH 对话。

## 核心能力
- 在 DSH Web 右上角提供可折叠拖动的📈自选股药丸与展开面板：折叠态显示当前分组涨跌家数（`3↑0↓`），展开后列出名称/代码、现价、涨跌幅、迷你分时折线与目标价触发标记（买入/卖出/等待）
- 支持多分组自选股（分组名、代码、买卖目标价），面板内 `＋` 按名称/代码检索全 A 股池（约 5549 只）；分组配置持久化在浏览器 `localStorage`，首次启动从 `~/.stocking/settings.json` 一次性迁移
- 提供分时视图（含黄色均价 VWAP 线与昨收基准虚线，按 A 股交易时段 09:30–11:30 / 13:00–15:00 标注，午间留白）与日/周/月前复权 K 线（蜡烛+成交量柱+MA5/10/20/60 均线）；K 线支持 `＋/−/重置` 缩放，MA 显隐可切换
- 买入/卖出目标价在列表与详情实时显示，详情页点击进入数字输入（两位小数、留空清除、回车确认、Esc 取消），保存后立即写回 localStorage 并重算触发标记
- 胶囊拖到屏幕四边自动吸附为半球（仅显示涨跌家数）；悬浮胶囊触发 GSAP 扇形动画菜单，提供「📊 行情分析 / 📅 每日复盘 / 🚀 涨停分析」三个选项，方向按胶囊所在象限自动布局，鼠标在菜单内不收起
- 详情页"📈投资研究报告"按钮与扇形菜单点击均新开 DSH 对话发送简短关键词，由 host 端注入的条件式系统指令保证自动按预定义框架（A 股短线复盘 / 行情分析 4 项 / 涨停分析 4 项 / 投资研究+前端设计）执行

## 技术实现
- **语言**: JavaScript（ESM，未启用 TypeScript；`index.js` + `client.js` 两个源文件）
- **关键依赖**: Host 端零外部依赖（仅用 `node:os`、`node:fs/promises`、`node:fs`、`node:url` 内置模块与 Node 原生 `fetch`）；Client 端通过 `__ModuleLoader__.require("react")` 复用宿主 React；图表层懒加载 CDN：`lightweight-charts@4.2.3`（unpkg / jsdelivr 双源）与 `gsap@3.12.5`，CDN 不可用时自动降级为自绘 SVG 蜡烛与折线
- **架构模式**: dual-half 宿主插件。Host half 通过 `ctx.inject(['webServer'])` 注册 5 条 `/dsh-stock-watch/*` 路由（`config` / `stocks` / `quotes` / `kline` / `minute`），并在 `apply` 启动时通过 `ensureUserSkills()` 把随包 `investment-research` 与 `frontend-design` 两个技能复制到 `~/.agents/skills/`（目标已存在则跳过），随后通过 `ctx.get('systemPrompt')` 注入两条 `order`=200 / 201 的条件式 system prompt section；Client half 通过 `ctx.slots.inject("shell.overlay", ...)` 在 DSH Web 右上角嵌入可拖动 React 弹窗，依赖宿主的 `slots`、`connection`、`sessions` 服务
- **入口文件**: Host 入口 `index.js`（`apply` / `name = 'dsh-stock-watch'`，`inject = ['webServer']`）；Client 入口 `client.js`（`inject = ['slots']`）；挂载声明 `cordis.patch.yml`（在 web profile 插入 1 行 Loader）+ `package.json#dsh.bundle.patch` + `package.json#dsh.client.platform = 'web'`

## 适用场景
在 DSH Web 工作流中写作或对话的 A 股投资者，希望在不离开聊天界面的前提下随时看到自选股涨跌与达到目标价的提示，并把临时冒出的"今天看好哪只、为什么""盘后复盘""涨停分析"等问题一键转交给 DSH 对话获得投研回答或盘后复盘。

## 前置依赖与兼容性
| 依赖 | 最低版本 | 说明 |
|---|---|---|
| DeepSeek Harness (DSH) | 未声明 | `package.json` 未声明 `engines` 或 `dshhub.compatibility.dsh`；通过 `dsh plugin --profile web add` 安装，依赖 `webServer` / `slots` 两个宿主服务 |
| Node.js | 未声明 | `package.json` 未声明 `engines`；源码使用 Node 原生 `fetch`、`AbortSignal.timeout(12000)`、`node:fs/promises`、`fileURLToPath`，建议 Node ≥18（fetch 与 timeout 稳定版本） |
| 平台 | 跨平台 | 纯 JS + 内置 Node 模块，无原生依赖；Host 端在启动时联网腾讯财经 `web.ifzq.gtimg.cn`，Client 端可选访问 `unpkg.com` / `cdn.jsdelivr.net` |
| 原生模块 | 无 | 不引入 `node-gyp` 模块，全部依赖为 JS 或纯浏览器脚本 |

## 安装方式
```bash
dsh plugin --profile web add github:Awu12277/dsh-stock-watch
```

## 配置项
本插件没有宿主端的 Schema 配置；自选股、买卖目标价、面板位置、面板尺寸与 MA 均线显隐均在浏览器 `localStorage` 中通过面板 UI 管理。Host 端提供两个可选环境变量：

| 配置 | 类型 | 说明 | 默认值 |
|---|---|---|---|
| `DSH_STOCK_WATCH_NO_SKILLS` | 环境变量 | 设置为 `1` 后禁用首次启动时把随包技能复制到用户技能目录的逻辑 | 未设置（启用注入） |
| `DSH_STOCK_WATCH_SKILLS_DIR` | 环境变量 | 自定义技能注入目标目录，覆盖默认的 `~/.agents/skills` | `~/.agents/skills` |

## 常见问题
**Q: 安装后右上角没有出现📈自选股药丸怎么办？**

A: 确认安装命令带了 `--profile web` 并且安装后重启了 `dsh web`。`package.json#dsh.client.platform` 固定为 `web`，只有 web profile 会在启动时扫描这个 bundle；仅刷新浏览器不会重新装载宿主页与客户端模块。

**Q: 行情数据从哪里来？和官方接口一样吗？**

A: Host 端使用 Node 原生 `fetch` 直连腾讯财经公开接口 `web.ifzq.gtimg.cn`（`minute/query` 与 `fqkline/get`），与上游 CLI 项目 stocking 的 `market.ts` 同源。即使 DSH 部署未挂载 web fetch provider 或沙箱封锁了部分网络，本插件仍能取到行情。

**Q: 自选股怎么添加？数据存在哪里？怎么彻底清除？**

A: 在面板顶部按 `＋` 进入添加视图，按名称或代码检索全 A 股池（约 5549 只），回车即加入当前分组。所有用户配置（分组、代码、买卖目标价、面板位置、面板尺寸、MA 显隐）都持久化在浏览器的 `localStorage`，key 分别为 `stocking.config.v1` / `stocking.pos.v1` / `stocking.size.v1` / `stocking.ma.v1`。首次安装时若检测到 `~/.stocking/settings.json` 会自动迁移，之后 `localStorage` 为唯一来源；浏览器控制台执行 `localStorage.removeItem('stocking.config.v1')` 后刷新即可恢复默认分组（上证指数、沪深 300、紫金矿业）。

**Q: 右上角的"一键投资研究"和扇形菜单是怎么工作的？会泄露我的设置吗？**

A: 它们都不会把提示词正文暴露在消息里。"投资研究"按钮发送的是简短消息 `分析{公司名}（代码）`，扇形菜单发送的是"每日复盘 / 行情分析 / 涨停分析"三个关键词。完整提示词由 host 端通过 `ctx.get('systemPrompt').section()` 注入两条条件式 system prompt section，仅当用户消息匹配"分析某家上市公司"或对应关键词时按框架展开，避免污染日常对话。注意「每日复盘」只在 15:00 至次日 09:00 之间可点击，交易时段会被置灰并提示"还未收盘"。

**Q: 目标价触发后怎么提醒？需要打开页面吗？**

A: 详情页点 "买入目标" / "卖出目标" 进入数字输入（两位小数、留空清除、回车确认、Esc 取消），保存后回写 localStorage 并即时重算。当前价 ≥ 卖出价标记 `卖出`，≤ 买入价标记 `买入`，反之为 `等待`，在列表与详情以胶囊颜色显示。插件不会发送系统级推送通知，需要保持 DSH Web 页面打开。

**Q: K 线、扇形动画需要联网吗？网不好会怎么样？**

A: K 线默认从 `unpkg.com` 与 `cdn.jsdelivr.net` 加载 `lightweight-charts@4.2.3`，扇形菜单加载 `gsap@3.12.5`，两个 CDN 依次尝试。CDN 不可达时会自动降级为自绘 SVG（蜡烛与折线仍可见），但缩放交互动画、GSAP 扇形展开等细节可能不完整。

**Q: 卸载之后还要清理什么？**

A: 执行 `dsh plugin --profile web remove dsh-stock-watch` 后重启 `dsh web`，客户端弹窗与宿主路由会被一并移除。本插件首次启动时复制的 `~/.agents/skills/investment-research` 与 `~/.agents/skills/frontend-design` 因为是文件级复制，会按普通文件保留（如不再需要可手动 `rm -rf` 清理）；用户已有的同名技能不会被覆盖。

**Q: 哪些时段能看到实时行情？非交易时段的数据是昨天的吗？**

A: 数据来自腾讯财经分钟接口。A 股交易时段（北京时间 09:30–11:30 / 13:00–15:00）提供分钟级折线；非交易时段返回的是收盘后的快照，列表每 10 秒刷新一次。分时视图的时间轴会按交易日时段标注，午间 11:30–13:00 留白。

## 上手难度
入门 — 一条 `dsh plugin --profile web add` + 重启 `dsh web`，刷新页面即可看到右上角药丸，初次自选股配置都通过面板内 `＋` 与分组 tab 完成，无需编辑配置文件。

## 已知问题与限制
- 安装或更新后必须重启 `dsh web`：客户端 bundle 与 cordis 插件行均在启动时扫描，仅刷新浏览器不会重新装载（README.md:26）
- 行情接口来自腾讯财经公开端点 `web.ifzq.gtimg.cn`：连接失败时列表行显示"行情获取失败，请稍后重试"，插件不缓存上次价格，刷新即重新请求（client.js:1660 / index.js:387）
- 腾讯财经 K 线返回列序以 `[date, open, close, high, low, volume]` 为基准：插件对最后一根 K 线以"现价 vs 最近价"做自校正保险，若接口列序再次变动需要相应调整（index.js:329-342）
- 「每日复盘」扇形菜单选项仅在 15:00 至次日 09:00 之间可点击：交易时段会置灰并提示"还未收盘"，避免盘未收却要求复盘（README.md:54）
- 客户端图表与扇形动画默认走 `unpkg.com` / `cdn.jsdelivr.net`：不可达时自动降级为自绘 SVG，K 线缩放（`＋/−/重置`）与 GSAP 扇形动画等细节可能不完整（client.js:225-300）
- 自选股持久化绑定浏览器 `localStorage`：跨浏览器、跨设备或无痕模式不会同步自选股；多设备共用需自行导出/导入 `stocking.config.v1`（client.js:810-837）

---

This document is auto-generated by [deepseek-plugin.org](https://deepseek-plugin.org). HTML page: [dsh-stock-watch](https://deepseek-plugin.org/plugins/Awu12277/dsh-stock-watch)
Wiki generated by AI (model: `MiniMax-M3`)
