🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

铺脉区位分析 hancao97/pumai-dsh

DeepSeek Harness
hancao9758 天前有提交已提供中文文档扫描:含敏感能力

选定位置生成周边商业报告并支持追问

29.4/100
综合分
3
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/3 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add hancao97/pumai-dsh
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:需留意
是什么
dsh 原生插件 · tool
装得上吗
实装验证未通过(unknown),装前请到仓库确认最近更新与 issue
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 58 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
⚠︎ 实装验证未通过(unknown · 2026/10/4) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件
查看扫描证据(共 76 处,展示前 61 条)
  • 读取本地文件
    packages/agent-tools/src/index.ts:258
    const stat = lstatSync(requested)
  • 读取本地文件
    packages/agent-tools/src/index.ts:264
    const snapshotStat = lstatSync(snapshots)
  • 读取本地文件
    packages/agent-tools/src/index.ts:275
    const stat = lstatSync(target)
  • 读取本地文件
    packages/agent-tools/src/index.ts:281
    return readFileSync(realFile)
  • 读取本地文件
    packages/domain/src/analysis.ts:124
    if (existsSync(target)) throw new Error(`周边结果缓存已存在:${resultId}`)
  • 读取本地文件
    packages/domain/src/analysis.ts:131
    if (!existsSync(target)) return null
  • 读取本地文件
    packages/domain/src/analysis.ts:172
    if (existsSync(targetPaths.analysisDir)) {
  • 写入本地文件
    packages/domain/src/analysis.ts:232
    renameSync(stageDir, targetPaths.analysisDir)
  • 写入本地文件
    packages/domain/src/analysis.ts:233
    chmodSync(targetPaths.analysisDir, 0o700)
  • 读取本地文件
    packages/domain/src/analysis.ts:236
    if (existsSync(stageDir)) rmSync(stageDir, { recursive: true, force: true })
  • 删除本地文件递归
    packages/domain/src/analysis.ts:236
    if (existsSync(stageDir)) rmSync(stageDir, { recursive: true, force: true })
  • 读取本地文件
    packages/domain/src/analysis.ts:639
    if (existsSync(path)) {
  • 读取本地文件
    packages/domain/src/analysis.ts:640
    const stat = lstatSync(path)
  • 写入本地文件
    packages/domain/src/analysis.ts:642
    chmodSync(path, 0o700)
  • 写入本地文件
    packages/domain/src/analysis.ts:645
    mkdirSync(path, { recursive: false, mode: 0o700 })
  • 写入本地文件
    packages/domain/src/analysis.ts:646
    chmodSync(path, 0o700)
  • 写入本地文件
    packages/domain/src/analysis.ts:652
    writeFileSync(descriptor, content)
  • 删除本地文件
    packages/domain/src/analysis.ts:667
    if (existsSync(temporary)) rmSync(temporary, { force: true })
  • 写入本地文件
    packages/domain/src/database.ts:249
    chmodSync(path, 0o600)
  • 读取本地文件
    packages/domain/src/database.ts:717
    if (!existsSync(path)) {
  • 写入本地文件
    packages/domain/src/database.ts:722
    chmodSync(path, 0o600)
  • 写入本地文件
    packages/domain/src/database.ts:728
    chmodSync(file, 0o600)
  • 读取本地文件
    packages/domain/src/database.ts:752
    const stat = lstatSync(path)
  • 写入本地文件
    packages/domain/src/paths.ts:109
    mkdirSync(directory, { recursive: false, mode: 0o700 })
  • 写入本地文件
    packages/domain/src/paths.ts:221
    mkdirSync(paths.root, { recursive: false, mode: 0o700 })
  • 读取本地文件
    packages/domain/src/paths.ts:232
    const entries = readdirSync(paths.root)
  • 读取本地文件
    packages/domain/src/paths.ts:253
    const content = readFileSync(sentinel, 'utf8')
  • 写入本地文件
    packages/domain/src/paths.ts:267
    writeFileSync(descriptor, SENTINEL_CONTENT, 'utf8')
  • 读取本地文件
    packages/domain/src/paths.ts:275
    for (const name of readdirSync(paths.root)) {
  • 读取本地文件
    packages/domain/src/paths.ts:298
    for (const name of readdirSync(paths.databaseDir)) {
  • 读取本地文件
    packages/domain/src/paths.ts:309
    for (const name of readdirSync(paths.cacheDir)) {
  • 读取本地文件
    packages/domain/src/paths.ts:348
    const stat = lstatSync(path)
  • 写入本地文件
    packages/domain/src/paths.ts:362
    chmodSync(path, 0o700)
  • 写入本地文件
    packages/domain/src/paths.ts:368
    chmodSync(path, 0o600)
  • 写入本地文件
    packages/domain/src/paths.ts:373
    chmodSync(path, 0o700)
  • 读取本地文件
    packages/domain/src/reports.ts:99
    if (existsSync(destination)) {
  • 删除本地文件递归
    packages/domain/src/reports.ts:106
    rmSync(stage, { recursive: true, force: true })
  • 写入本地文件
    packages/domain/src/reports.ts:108
    renameSync(stage, destination)
  • 写入本地文件
    packages/domain/src/reports.ts:109
    chmodSync(destination, 0o700)
  • 读取本地文件
    packages/domain/src/reports.ts:112
    if (existsSync(stage)) rmSync(stage, { recursive: true, force: true })
  • 删除本地文件递归
    packages/domain/src/reports.ts:112
    if (existsSync(stage)) rmSync(stage, { recursive: true, force: true })
  • 读取本地文件
    packages/domain/src/reports.ts:167
    if (!existsSync(workspace.reportsDir)) return []
  • 读取本地文件
    packages/domain/src/reports.ts:170
    for (const entry of readdirSync(workspace.reportsDir)) {
  • 写入本地文件
    packages/domain/src/reports.ts:231
    mkdirSync(path, { recursive: false, mode: 0o700 })
  • 写入本地文件
    packages/domain/src/reports.ts:232
    chmodSync(path, 0o700)
  • 写入本地文件
    packages/domain/src/reports.ts:238
    writeFileSync(descriptor, content)
  • 写入本地文件
    packages/domain/src/reports.ts:242
    chmodSync(path, 0o600)
  • 读取本地文件
    packages/domain/src/reports.ts:246
    const stat = lstatSync(path)
  • 读取本地文件
    packages/domain/src/reports.ts:248
    return readFileSync(path, 'utf8')
  • 读取本地文件
    packages/host/src/nearby-cache.ts:54
    for (const entry of readdirSync(this.paths.nearbyCacheDir)) {
  • 读取本地文件
    packages/host/src/nearby-cache.ts:76
    for (const entry of readdirSync(this.paths.nearbyCacheDir)) {
  • 读取本地文件
    packages/host/src/nearby-cache.ts:105
    const stat = lstatSync(target)
  • 删除本地文件
    packages/host/src/nearby-cache.ts:107
    unlinkSync(target)
  • 读取本地文件
    packages/host/src/service.ts:1345
    if (existsSync(workspace.workspaceReportPath)) {
  • 读取本地文件
    packages/host/src/service.ts:1346
    const stat = lstatSync(workspace.workspaceReportPath)
  • 写入本地文件
    packages/host/src/service.ts:1355
    writeFileSync(descriptor, publishableContent)
  • 写入本地文件
    packages/host/src/service.ts:1360
    chmodSync(temporary, 0o600)
  • 写入本地文件
    packages/host/src/service.ts:1361
    renameSync(temporary, workspace.workspaceReportPath)
  • 写入本地文件
    packages/host/src/service.ts:1362
    chmodSync(workspace.workspaceReportPath, 0o600)
  • 读取本地文件
    packages/host/src/service.ts:1364
    if (existsSync(temporary)) rmSync(temporary, { force: true })
  • 删除本地文件
    packages/host/src/service.ts:1364
    if (existsSync(temporary)) rmSync(temporary, { force: true })
扫描于 2026/11/2(1 天前) · 范围 全包扫描(包内未声明入口) · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-client-connection@deepseek-ai/dsh-client-runtime@deepseek-ai/dsh-client-ui-conversation@deepseek-ai/dsh-client-ui-layout@deepseek-ai/dsh-client-ui-primitives@deepseek-ai/dsh-client-ui-slots@deepseek-ai/dsh-credentials@deepseek-ai/dsh-host-apiproxy@deepseek-ai/dsh-session@deepseek-ai/dsh-tools@deepseek-ai/schemastery
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 生成周边商业报告
  • 支持追问

README

由 DeepSeek 最新模型翻译生成
铺脉 · Pumai 基于高德地图的商业区位分析工作台 =24"> 使用体验 ·快速开始 ·数据与报告 ·参与开发 看懂一公里,再决定开什么。铺脉品牌插画 从地图上的一个位置开始,铺脉整理周边的商业与生活配套,生成中文商业分析报告,并让你围绕同一份资料继续追问。适合开店前了解周边、初步比较商圈,以及整理现场考察的方向。 项目、数据快照和报告保存在本地;地图服务来自高德,AI 分析由你在 DeepSeek Harness(DSH)中配置的模型完成。 使用体验 | 步骤 | 你可以做什么 | | 01 · 选一个位置 | 搜索地址、小区、商场或地铁站,也可以直接在地图上选点;确认 500 米、1 公里或 2 公里的分析范围。 | | 02 · 看周边结构 | 查看九类地点的分布、数量、距离和详情,了解周边供给,并查看接口返回不完整的提示。 | | 03 · 读商业报告 | 创建分析项目,生成包含区位特征、供给结构、机会、风险与考察建议的报告。 | | 04 · 接着聊下去 | 沿用项目资料继续追问,例如“餐饮竞争集中在哪里?”“实地走访应优先看什么?
展开完整文档(README 剩余 1 节)
铺脉 · Pumai

基于高德地图的商业区位分析工作台

=24">

使用体验 ·快速开始 ·数据与报告 ·参与开发

看懂一公里,再决定开什么。铺脉品牌插画

从地图上的一个位置开始,铺脉整理周边的商业与生活配套,生成中文商业分析报告,并让你围绕同一份资料继续追问。适合开店前了解周边、初步比较商圈,以及整理现场考察的方向。

项目、数据快照和报告保存在本地;地图服务来自高德,AI 分析由你在 DeepSeek Harness(DSH)中配置的模型完成。

使用体验

| 步骤 | 你可以做什么 |
| 01 · 选一个位置 | 搜索地址、小区、商场或地铁站,也可以直接在地图上选点;确认 500 米、1 公里或 2 公里的分析范围。 |
| 02 · 看周边结构 | 查看九类地点的分布、数量、距离和详情,了解周边供给,并查看接口返回不完整的提示。 |
| 03 · 读商业报告 | 创建分析项目,生成包含区位特征、供给结构、机会、风险与考察建议的报告。 |
| 04 · 接着聊下去 | 沿用项目资料继续追问,例如“餐饮竞争集中在哪里?”“实地走访应优先看什么?” |

地图与周边数据

餐饮 · 购物 · 生活服务 · 商务住宅 · 交通设施 · 学校 · 公园 · 医疗健康 · 体育休闲

铺脉地图与九类周边数据界面示意

报告与持续对话

每个项目都有「位置档案」「结构化周边数据」「商业分析报告」「继续对话」四个视图。
报告支持目录导航、字号调节、专注模式、阅读进度和 Markdown 导出;对话保留上下文,方便继续讨论。

铺脉商业分析报告界面示意

以上为演示示意图,使用合成数据说明产品布局;实际界面与地点数量以运行版本和查询结果为准。

快速开始

需要 Node.js ^22.19.0 或 >=24.0.0、pnpm 11.7.0,以及 DSH 0.1.1-rc.2。当前安装器会检查 DSH 版本,请使用这里列出的版本。

1. 安装并启动

如果尚未安装 pnpm 和 DSH:

npm install -g pnpm@11.7.0 @deepseek-ai/dsh@0.1.1-rc.2

获取源码、构建并安装铺脉专用 Profile:

git clone https://github.com/hancao97/pumai-dsh.git
cd pumai-dsh
pnpm install --frozen-lockfile
pnpm run build
pnpm run profile:install -- --package .
pnpm run profile:verify
dsh --profile pumai --host 127.0.0.1 --port 3080

打开 本地工作台。铺脉安装在独立的 pumai Profile 中,官方通用界面仍可通过 dsh web 启动。

2. 配置高德地图

在高德开放平台准备以下三项,按首次启动时的配置向导填写:

| 配置 | 用途 |
| Web 服务 Key | 服务端查询地点、周边与地址信息 |
| Web 端(JS API)Key | 页面加载高德地图 |
| securityJsCode | 与 JS API Key 配套的安全密钥 |

三项配置齐全后即可使用地图与周边查询,保存后无需重启进程。

3. 配置模型,生成第一份报告

在 DSH 的模型设置中配置一个可用模型。回到地图选点、确认范围并查询周边,再点击 「生成 AI 商业分析」。完成后进入项目阅读报告,或切换到「继续对话」。

地图与周边查询可以独立使用;生成报告和继续对话需要可用的模型服务。

通过环境变量配置高德

也可以在启动前设置以下环境变量。它们优先于页面保存的配置,向导不会修改环境变量。

export PUMAI_AMAP_WEB_SERVICE_KEY='your-web-service-key'
export PUMAI_AMAP_JS_KEY='your-js-api-key'
export PUMAI_AMAP_SECURITY_JS_CODE='your-security-js-code'
dsh --profile pumai --host 127.0.0.1 --port 3080

数据与报告

flowchart LR
A[地图选点] --> B[高德周边查询]
B --> C[整理统计并保存快照]
C --> D[AI 读取项目资料]
D --> E[生成并保存报告]
E --> F[沿用资料继续对话]

- 数量来自程序统计。 对本次返回的地点按 POI ID 去重,再按分类编码和距离整理。查询分类可能重叠,分类数量之和不一定等于去重后的总数。
- 报告使用固定资料。 创建项目时保存当前查询结果、位置档案和范围几何;智能体通过只读工具分页读取这些资料,后续讨论沿用同一份快照。
- 查询有明确边界。 本项目每类最多读取 8 页、每页 25 条。达到窗口上限、超时或字段缺失会被记录,已收录的地点数量也不等于现实中的全部门店。
- 减少重复调用。 完整的周边查询结果可缓存 30 分钟;相同的在途请求会合并,高德服务端请求按凭据限速。月度请求上限可在页面配置,这些是本地保护设置。
- 报告原文留存。 完成后保存报告原文、使用的模型和内容哈希,普通追问不会覆盖已封存报告。文件一致性检查不代表 AI 的商业判断已经得到现实验证。

当前资料能说明周边有什么、分布如何。 实际客流、进店人数、租金和经营收益需要另行调查;地图上的直线距离也不能直接当作步行距离。报告中的机会与风险属于分析判断,需结合具体铺位和现场情况理解。

本地存储与网络

| 内容 | 存放或传输位置 |
| 项目快照、报告、业务索引与请求用量 | 默认保存在本机 ~/.pumai-dsh |
| 对话消息与工具活动 | 由本机 DSH Session 持久化 |
| 地点搜索、坐标与地图请求 | 发送给高德地图服务 |
| 分析所需的项目资料与用户问题 | 发送给你配置的模型服务 |

数据目录与凭据管理

业务数据根按以下优先级解析:Host dataRoot 配置 → PUMAI_DSH_HOME 环境变量 → ~/.pumai-dsh。

~/.pumai-dsh/
├── .credentials.yaml # 由 DSH 管理的凭据 ├── db/pumai.sqlite # 业务索引、状态与请求用量 ├── cache/nearby/ # 有时限的查询结果缓存 ├── analyses/<project-id>/ │ ├── manifest.json # 文件清单与哈希 │ ├── snapshots/ # 位置、周边地点与范围几何 │ ├── workspace/ # 项目会话工作区 │ └── reports/0001/ # 报告原文与元数据 ├── exports/ └── tmp/

cache/nearby 只短期保存规范化查询结果,正式分析资料保存在项目快照中。
SQLite 通过 opaque dshSessionId 关联项目与 DSH 会话;消息和工具活动由 DSH 保存,不会复制进业务数据库。

高德和模型凭据由 DSH Credentials provider 管理,默认写入 ~/.pumai-dsh/.credentials.yaml,文件权限为 0600;不会写入 SQLite、项目快照或报告。高德 Web 服务 Key 只在服务端使用, JS API Key 与安全密钥在初始化地图时进入页面内存。

使用 PUMAI_DSH_HOME 可以同时移动业务数据和受管凭据文件。Host dataRoot 配置只改变业务数据位置;如需单独调整凭据路径,可在 Profile patch 中设置 credentials.path。
其它 DSH Profile 继续使用各自的凭据位置。

开发

项目使用 TypeScript + React + DSH。铺脉提供地图、数据与报告工作台,DSH 提供模型、智能体和会话运行时。

| 命令 | 用途 |
| pnpm run dev | 监听源码并构建 |
| pnpm run build | 构建 Host、Web Client、智能体工具与安装脚本 |
| pnpm run typecheck | TypeScript 类型检查 |
| pnpm test | 运行测试 |
| pnpm run pack:check | 检查实际 npm 打包内容与发布约束 |
| pnpm run check | 执行类型检查、构建、测试和打包检查 |
| pnpm run profile:verify | 检查已安装的铺脉 Profile |

代码结构

packages/
├── client-workbench/ # 地图、分析项目与报告阅读器 ├── client-chat/ # 基于 DSH Session 的对话界面 ├── host/ # 高德请求、缓存、项目与报告服务 ├── agent-tools/ # 项目资料只读工具 ├── domain/ # 数据模型、统计与存储 └── contracts/ # 前后端共享协议 assets/agent-presets/ # 铺脉分析 Agent 配置 scripts/ # 构建、安装与发布校验 tests/ # 包与运行时契约测试 docs/ # 设计、研究与架构资料

产品设计 · 架构说明 · 对话组件

设计与研究文档包含规划内容,当前功能以本 README 和代码为准。

MIT License ·第三方说明 · Built with DeepSeek Harness
预览分享卡片长什么样 ↓hancao97/pumai-dsh
分享 · DeepSeek Harness Hub
hancao97/pumai-dsh

选定位置生成周边商业报告并支持追问

这是你的仓库?认领条目

回到顶部