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

行业公司研究包 PerryLink/dsh-industry-research

DeepSeek Harnessv0.3.23
PerryLink2 天前有提交已提供中文文档扫描:含敏感能力searchdata

DeepSeek Harness 的行业与公司研究领域包:方法论技能、产业链梳理、公开来源政策/新闻追踪、公司研究卡片,以及可审计的研究报告。只做研究,不构成投资建议。

62.7/100
综合分
216
GitHub 星标
1,075
npm 周下载
—/5
用户评分

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

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add dsh-industry-research
npm 源 · dsh-industry-research 的发布者账号已校验与本仓库一致

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · security
装得上吗
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L5 · 运行时冒烟等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 2 天前
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过
展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包dsh-industry-research @ 0.3.23
✓Node 引擎要求 ^22.19.0 || >=24.0.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/30 02:37:35

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

读写/删除本地文件发起外部网络请求
查看扫描证据(共 111 处,展示前 80 条)
  • 读取本地文件
    lib/index.js:856
    text = await readFile(path, "utf8");
  • 写入本地文件
    lib/index.js:874
    await mkdir(dirname(path), { recursive: true });
  • 写入本地文件
    lib/index.js:875
    await writeFile(path, `${JSON.stringify(registry, null, 2)}\n`, "utf8");
  • 读取本地文件
    lib/index.js:1079
    text = await readFile(path, "utf8");
  • 写入本地文件
    lib/index.js:1125
    await mkdir(dirname(path), { recursive: true });
  • 写入本地文件
    lib/index.js:1126
    await writeFile(path, `${records.map((record) => JSON.stringify(record)).join("\n")}\n`, "utf8");
  • 读取本地文件
    lib/index.js:1168
    text = await readFile(path, "utf8");
  • 写入本地文件
    lib/index.js:1193
    await mkdir(dirname(path), { recursive: true });
  • 写入本地文件
    lib/index.js:1194
    await writeFile(path, `${JSON.stringify(state, null, 2)}\n`, "utf8");
  • 读取本地文件
    lib/index.js:1609
    const content = await readFile(absolute, "utf8");
  • 读取本地文件
    lib/index.js:1648
    const chainText = await readFile(chainPath, "utf8");
  • 读取本地文件
    lib/index.js:1766
    text = await readFile(path, "utf8");
  • 发起网络请求
    lib/index.js:2029
    const outcome = await web.fetch({ url: candidate.url }, requestSignal(exec.signal, config.fetchTimeoutMs));
  • 读取本地文件
    lib/types/versions.js:36
    text = await readFile(path, 'utf8');
  • 写入本地文件
    lib/types/versions.js:84
    await mkdir(dirname(path), { recursive: true });
  • 写入本地文件
    lib/types/versions.js:85
    await writeFile(path, `${records.map(record => JSON.stringify(record)).join('\n')}\n`, 'utf8');
  • 读取本地文件
    lib/types/research-state.js:22
    text = await readFile(path, 'utf8');
  • 写入本地文件
    lib/types/research-state.js:55
    await mkdir(dirname(path), { recursive: true });
  • 写入本地文件
    lib/types/research-state.js:56
    await writeFile(path, `${JSON.stringify(state, null, 2)}\n`, 'utf8');
  • 读取本地文件
    lib/types/sources.js:25
    text = await readFile(path, 'utf8');
  • 写入本地文件
    lib/types/sources.js:44
    await mkdir(dirname(path), { recursive: true });
  • 写入本地文件
    lib/types/sources.js:45
    await writeFile(path, `${JSON.stringify(registry, null, 2)}\n`, 'utf8');
  • 读取本地文件
    lib/types/timeline.js:83
    text = await readFile(path, 'utf8');
  • 写入本地文件
    lib/types/timeline.js:156
    await mkdir(dirname(path), { recursive: true });
  • 写入本地文件
    lib/types/timeline.js:157
    await writeFile(path, kept.map(entry => JSON.stringify(entry)).join('\n') + (kept.length > 0 ? '\n' : ''), 'utf8');
  • 读取本地文件
    lib/types/company.js:40
    const info = await stat(path);
  • 读取本地文件
    lib/types/company.js:46
    const content = await readFile(path, 'utf8');
  • 写入本地文件
    lib/types/company.js:80
    await mkdir(dir, { recursive: true });
  • 写入本地文件
    lib/types/company.js:83
    await writeFile(cardJsonPath, `${JSON.stringify(card, null, 2)}\n`, 'utf8');
  • 写入本地文件
    lib/types/company.js:84
    await writeFile(cardPath, renderCardMarkdown(card), 'utf8');
  • 读取本地文件
    lib/types/company.js:174
    const text = await readFile(cardJsonPath, 'utf8');
  • 写入本地文件
    lib/types/report.js:353
    await mkdir(reportDir, { recursive: true });
  • 写入本地文件
    lib/types/report.js:375
    await writeFile(reportPath, renderFallbackMarkdown(industry, draft, evidence, generatedAt, machineCheck, perspectives), 'utf8');
  • 写入本地文件
    lib/types/report.js:376
    await writeFile(manifestPath, `${JSON.stringify(manifest, null, 2)}\n`, 'utf8');
  • 写入本地文件
    lib/types/tools/map.js:151
    await mkdir(notesDir, { recursive: true });
  • 写入本地文件
    lib/types/tools/map.js:154
    await writeFile(notePath, noteContent, 'utf8');
  • 读取本地文件
    lib/types/tools/map.js:159
    const content = await readFile(absolute, 'utf8');
  • 写入本地文件
    lib/types/tools/map.js:199
    await mkdir(dir, { recursive: true });
  • 写入本地文件
    lib/types/tools/map.js:201
    await writeFile(chainPath, chainContent, 'utf8');
  • 读取本地文件
    lib/types/tools/map.js:207
    const chainText = await readFile(chainPath, 'utf8');
  • 写入本地文件
    lib/types/tools/map.js:221
    await writeFile(svgPath, svgContent, 'utf8');
  • 发起网络请求
    lib/types/tools/track.js:155
    const outcome = await web.fetch({ url: candidate.url }, requestSignal(exec.signal, config.fetchTimeoutMs));
  • 读取本地文件
    lib/types/tools/company.js:160
    await recordVersion(versionsPath, rootRelative(root, cardJsonPath), await readFile(cardJsonPath, 'utf8'), now);
  • 读取本地文件
    lib/types/tools/company.js:161
    await recordVersion(versionsPath, rootRelative(root, cardPath), await readFile(cardPath, 'utf8'), now);
  • 读取本地文件
    lib/types/tools/report.js:89
    chainContent = await readFile(chainPath, 'utf8');
  • 读取本地文件
    lib/types/tools/report.js:113
    const content = await readFile(timelinePath, 'utf8');
  • 读取本地文件
    lib/types/tools/report.js:139
    slugs = (await readdir(companiesDir, { withFileTypes: true })).filter(entry => entry.isDirectory()).map(entry => entry.name);
  • 读取本地文件
    lib/types/tools/report.js:150
    cardContent = await readFile(cardJsonPath, 'utf8');
  • 写入本地文件
    lib/types/tools/report.js:283
    await writeFile(redNotePath, noteContent, 'utf8');
  • 写入本地文件
    lib/types/tools/report.js:312
    await writeFile(perspectivesNotePath, noteContent, 'utf8');
  • 读取本地文件
    lib/types/tools/report.js:351
    const dirName = reportDirName(new Date(), candidate => existsSync(join(reportsDir, candidate)));
  • 读取本地文件
    lib/types/tools/report.js:354
    await recordVersion(versionsPath, rootRelative(root, reportPath), await readFile(reportPath, 'utf8'), generatedAt);
  • 读取本地文件
    lib/types/index.js:60
    if (!existsSync(dir))
  • 读取本地文件
    lib/types/index.js:64
    entries = readdirSync(dir, { withFileTypes: true });
  • 读取本地文件
    lib/types/index.js:69
    return entries.some(entry => entry.isDirectory() && existsSync(join(dir, entry.name, 'SKILL.md')));
  • 读取本地文件
    src/company.ts:139
    const info = await stat(path)
  • 读取本地文件
    src/company.ts:144
    const content = await readFile(path, 'utf8')
  • 写入本地文件
    src/company.ts:177
    await mkdir(dir, { recursive: true })
  • 写入本地文件
    src/company.ts:180
    await writeFile(cardJsonPath, `${JSON.stringify(card, null, 2)}\n`, 'utf8')
  • 写入本地文件
    src/company.ts:181
    await writeFile(cardPath, renderCardMarkdown(card), 'utf8')
  • 读取本地文件
    src/company.ts:266
    const text = await readFile(cardJsonPath, 'utf8')
  • 读取本地文件
    src/index.ts:94
    if (!existsSync(dir)) return false
  • 读取本地文件
    src/index.ts:97
    entries = readdirSync(dir, { withFileTypes: true })
  • 读取本地文件
    src/index.ts:101
    return entries.some(entry => entry.isDirectory() && existsSync(join(dir, entry.name, 'SKILL.md')))
  • 写入本地文件
    src/report.ts:397
    await mkdir(reportDir, { recursive: true })
  • 写入本地文件
    src/report.ts:419
    await writeFile(reportPath, renderFallbackMarkdown(industry, draft, evidence, generatedAt, machineCheck, perspectives), 'utf8')
  • 写入本地文件
    src/report.ts:420
    await writeFile(manifestPath, `${JSON.stringify(manifest, null, 2)}\n`, 'utf8')
  • 读取本地文件
    src/research-state.ts:51
    text = await readFile(path, 'utf8')
  • 写入本地文件
    src/research-state.ts:77
    await mkdir(dirname(path), { recursive: true })
  • 写入本地文件
    src/research-state.ts:78
    await writeFile(path, `${JSON.stringify(state, null, 2)}\n`, 'utf8')
  • 读取本地文件
    src/sources.ts:49
    text = await readFile(path, 'utf8')
  • 写入本地文件
    src/sources.ts:67
    await mkdir(dirname(path), { recursive: true })
  • 写入本地文件
    src/sources.ts:68
    await writeFile(path, `${JSON.stringify(registry, null, 2)}\n`, 'utf8')
  • 读取本地文件
    src/timeline.ts:120
    text = await readFile(path, 'utf8')
  • 写入本地文件
    src/timeline.ts:188
    await mkdir(dirname(path), { recursive: true })
  • 写入本地文件
    src/timeline.ts:189
    await writeFile(path, kept.map(entry => JSON.stringify(entry)).join('\n') + (kept.length > 0 ? '\n' : ''), 'utf8')
  • 读取本地文件
    src/versions.ts:55
    text = await readFile(path, 'utf8')
  • 写入本地文件
    src/versions.ts:101
    await mkdir(dirname(path), { recursive: true })
  • 写入本地文件
    src/versions.ts:102
    await writeFile(path, `${records.map(record => JSON.stringify(record)).join('\n')}\n`, 'utf8')
  • 发起网络请求
    src/web.ts:39
    fetch(request: { url: string }, signal?: AbortSignal): Promise<WebFetchOutcome>
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包

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

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/cordis-plugin-include@deepseek-ai/cordis-plugin-loader@deepseek-ai/dsh-agent@deepseek-ai/dsh-llm@deepseek-ai/dsh-sandbox@deepseek-ai/dsh-session@deepseek-ai/dsh-skill@deepseek-ai/dsh-skill-filesystem@deepseek-ai/dsh-system-prompt@deepseek-ai/dsh-tools@deepseek-ai/dsh-user-approval
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

界面预览

2 张 · 点击查看大图

功能亮点

  • 行业研究方法论技能
  • 产业链梳理
  • 公司研究卡片
v0.3.232026-10-19
百分比指标现在标注 57.9(单位:%),数值与快照一致;非百分比单位保持原样。142 项测试通过。
v0.3.222026-10-18
· [0.3.22] - 2026-10-18 · 变更 · 把 tsdown/typescript(以及存在时的 @types/react)从运行时依赖移到 devDependencies。Git 安装仍能构建:pnpm 会为 git 依赖安装 devDependencies 并运行 prepare;npm 的 tarball 直接带上构建好的 lib/。运行时依赖树不再携带构建链。
v0.3.212026-10-18
· [0.3.21] - 2026-10-18 · 变更 · 新增 1280×720 主图和一段 960×540、4 秒的终端 GIF,由测试运行渲染生成;screenshots.json 改为对象数组,capture.json 记录命令。
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。

README

由 DeepSeek 最新模型翻译生成
🏭 dsh-industry-research - 1024 商店渠道:先执行一次 npm i -g dsh1024,再执行 dsh1024 plugin --profile web add dsh-industry-research(计入 deepseek1024.com 的安装排名)。 dshfind 面向 DeepSeek Harness 的行业与公司研究领域包。 产业链图谱、公开信源追踪、公司卡片、可审计报告 —— 每个数字都能追溯到信源,每处缺口都明确标注。 dsh-doctor DSH Market English · 简体中文 · Español · Português · हिन्दी dsh plugin --profile <name> add dsh-industry-research 只做研究,不构成投资建议。 本包只提供研究支持:不交易、不预测价格、不碰付费或需登录的信源。 📖 生态知识库 —— 实测数据,不是营销话术:插件开发指南 · 插件选型数据 · 维护标准。
展开完整文档(README 剩余 1 节)
🏭 dsh-industry-research

- 1024 商店渠道:先执行一次 npm i -g dsh1024,再执行 dsh1024 plugin --profile web add dsh-industry-research(计入 deepseek1024.com 的安装排名)。

dshfind

面向 DeepSeek Harness 的行业与公司研究领域包。

产业链图谱、公开信源追踪、公司卡片、可审计报告 —— 每个数字都能追溯到信源,每处缺口都明确标注。

dsh-doctor
DSH Market

English · 简体中文 · Español · Português · हिन्दी

dsh plugin --profile <name> add dsh-industry-research

只做研究,不构成投资建议。 本包只提供研究支持:不交易、不预测价格、不碰付费或需登录的信源。

📖 生态知识库 —— 实测数据,不是营销话术:插件开发指南 · 插件选型数据 · 维护标准。

安装与卸载

dsh plugin --profile demo add dsh-industry-research # install
dsh plugin --profile demo remove dsh-industry-research # uninstall

验证条目已挂载:dsh --profile demo --dump-config | grep dsh-industry-research。

⭐ 如果它帮到了你

这个插件是 DSH 插件家族的一员(95 个,全部 Apache-2.0)。如果你在用,给个 star —— 它不会解锁任何功能,但会让下一个人在搜索里更容易找到它。

English: part of a 95 plugin family for DeepSeek Harness. If it is useful, a star helps the next person find it — nothing is gated behind it.

dsh-industry-research 是什么?

DeepSeek Harness 的行业与公司研究领域包。

产业链图谱、公开来源追踪、公司卡片、可审计报告 —— 每个数字都能追溯到来源,每个缺口都会明确标注。

dsh-industry-research 的工作流示意图:问题 → 封存来源 → 报告。

工作流概览:问题 → 封存来源 → 报告。下面的示例都用真实的命令接口。

兼容性

- DeepSeek Harness dsh-v0.2.1-alpha.1(npm 已发布版本线,2026-09-25 验证;peer 为 >=0.1.2-rc.1 <0.2.0 || >=0.1.5-alpha.1 <0.2.0 || >=0.1.6-0 <0.2.0 || >=0.1.7-0 <0.2.0)。
0.1.2-rc.1(2026-09-02 适配):会话信封保留其可忽略字段,仅用于兼容已存储日志的读取 —— Session.append 仍然无法写入该字段,所以审计门禁行为不变。
2026-09-24 针对已发布的 0.1.7-rc.2 peer 验证(完整门禁链;真实的配置档安装冒烟测试在每周和每个 PR 的 compat.yml 任务里跑)。
- Node ^22.19.0 || >=24.0.0,仅支持 ESM("type": "module")。
- peer 依赖:@deepseek-ai/cordis ^4.0.2、@deepseek-ai/schemastery ^3.18.2,以及 @deepseek-ai/dsh-tools、@deepseek-ai/dsh-skill、@deepseek-ai/dsh-skill-filesystem,版本为 >=0.1.2-rc.1 <0.2.0 || >=0.1.5-alpha.1 <0.2.0 || >=0.1.6-0 <0.2.0 || >=0.1.7-0 <0.2.0(全部由官方 dsh-base 包组合)。
- 可选,执行时查找(从不注入):ctx.web(公开来源检索 —— 由 dsh-base 组合)和 ctx.researchReport(同家族的 dsh-research-report 封存引擎)。

你能得到什么

- industry_map —— 构建或更新产业链图谱(chain.json):上游/中游/下游节点、边、指标槽位。带 value 的指标必须带 sourceRef;没有值的槽位就是明确的缺口。节点的 status 断言要带 statusAsOf,可选的 taxonomyCode 必须命中内置的国民经济行业分类大类表。加上 renderSvg: true 还会写出一张确定性的、按层级分层的 chain.svg 网络图,并高亮漏斗/枢纽瓶颈。depth 参数用来缩放联网辅助(quick/standard/comprehensive)。种子笔记/文件和可选的 ctx.web 摘要会注册为可引用来源(S1、S2、……)。
- industry_track —— 通过官方 ctx.web 接缝做公开来源的政策/新闻追踪:按主题搜索、主机允许/阻止列表、since 过滤、带 SHA-256 溯源哈希的有界快照抓取,以及追加 + 去重写入 timeline.jsonl,并设保留上限。条目可以带经过校验的 evidenceCategory;depth 参数用来缩放来源数量。联网能力不可达时直接报错。
- company_scan —— 从工作区数据文件生成公司卡片(card.json + card.md),文件经 SHA-256 哈希,带 Markdown 大纲和图表候选行,让每个数字都能追溯到文件和行号,另外可选 ctx.web 引用补充。卡片带上市 status(含 statusAsOf)、格式校验过的 ticker,以及有来源的价格/估值 metrics(每项带 source + asOf)。批量模式(companies)会隔离单个出错的公司,不中断整批;depth 调节网络补充的规模。v1 只支持文本格式(不支持 PDF)。
- industry_report —— 从产业链图 + 时间线 + 卡片生成一份可审计的报告。生成之前,一份确定性的交付契约会检查区块、状态/价格断言和占位符残留(直接报错,绝不输出半成品报告)。时间线条目按 evidenceCategory 分组。确定性的多空(正反方)综合会列出有来源、有日期的数值,对照声明的缺口和数据质量问题,作为报告的多视角章节嵌入,并 fork 成子代理任务,把 perspectives-note.md 写入版本台账。挂载了 ctx.researchReport 引擎时,证据/章节/论断由它的 assemble 封存,并返回逐条论断的判定;没有引擎时,内置回退会写出带版本的 reports/<YYYYMMDD-HHmmss>/report.md + manifest.json,附 SHA-256 来源追溯表,并如实标注 engine: 'builtin-fallback'。
- 产物版本台账 —— industry_map / company_scan / industry_report 每次写入产物都会追加到 versions.jsonl(相对根目录的路径 + SHA-256 + 时间戳 + 变更类型);读取时校验哈希,不匹配直接报错。
- 两个方法论技能 —— industry-research-method(产业链拆解、供需框架、来源纪律、缺口声明纪律)和 company-research-method(公司框架、公开来源清单、合规措辞)。
- 类型化 Cordis 事件 —— 每个产物提交后发出 industry-research/map、industry-research/track、industry-research/report。

快速开始

dsh plugin --profile web add github:PerryLink/dsh-industry-research

git 渠道

From a scratch profile (pins the commit; runs the self-contained prepare build)
dsh plugin --profile demo add "github:PerryLink/dsh-industry-research#<sha>"
The profile's pnpm-workspace.yaml gains an allowBuilds entry for dsh-industry-research on first add.

npm 渠道

dsh plugin --profile demo add dsh-industry-research

两个渠道都会把 bundle 行(见 cordis.patch.yml)装进配置档的 dsh.profile.bundles 栈,重启后生效。

然后在会话里:

加载 industry-research-method 技能,然后研究白酒行业:先 industry_map 建产业链图,再 industry_track 跟踪政策,最后 industry_report 出报告。

示例

这些是插件的真实入口;装一次,然后调用其中一个。

详细示例

命令

~~~sh
industry_map({
industry: "示例", web: false,
chain: {
nodes: [
{ id: "up", name: "上游原料", tier: "upstream", metrics: [{ key: "价格", value: 10, unit: "元", asOf: "2026-01-01", sourceRef: "S1" }] }, { id: "down", name: "下游渠道", tier: "downstream", metrics: [{ key: "占比" }] } ],
edges: [{ from: "up", to: "down" }]
}
})

输出

~~~text
行业「示例」产业链图:已校验并写入 /tmp/dsh-industry-research-test-Pxf1l8/industry-research/示例/chain.json 节点 2 / 边 1;缺口 2 项。
与上次相比:新增源 0,移除源 0,未变化证据 0。
缺口清单:节点「下游渠道」(down) 的指标「占比」待补(无来源数值);产业链缺少 midstream 层节点
web 辅助未执行:调用方指定 web: false

来源:README.md:151-153; test/map.spec.ts:44-51; src/tools/map.ts:157-163; src/chain.ts:177-194

失败分支

输入

~~~text
{"industry":"白酒","web":false,"chain":{"industry":"白酒","nodes":[{"id":"upstream-1","name":"高粱种植","tier":"upstream","metrics":[{"key":"市场规模","value":120,"unit":"亿元"}]}],"edges":[]}}

输出

~~~text
isError=true; error.message=chain 校验失败(1 项):node "upstream-1" metric "市场规模" carries a value without a sourceRef — register the source or mark the slot 待补 (omit value)

来源:plugins/dsh-industry-research/src/chain.ts:158-159 (rule); plugins/dsh-industry-research/src/tools/map.ts:232-234 (throw); plugins/dsh-industry-research/README.md:179 (unsourced values fail loud); exercised through plugins/dsh-industry-research/test/harness.ts

简要示例

- industry_track
- company_scan
- industry_report

配置

所有可调项都是 Schemastery 的 Config 字段;值不合法时,配置档加载会直接报错。

| 键 | 默认值 | 说明 |
| enabled | true | 总开关;设为 false 时不挂载任何内容。 |
| industryRoot | industry-research | 产物根目录,相对会话工作区(也可用绝对路径)。 |
| fetchTimeoutMs | 20000 | ctx.web 搜索/抓取调用单次请求超时(ms)。 |
| timelineMaxEntries | 500 | 每个行业的 timeline.jsonl 保留条目数(超出丢弃最旧的)。 |
| sourceAllowlist | [] | 已跟踪来源的主机允许列表(空 = 允许所有主机)。 |
| sourceBlocklist | [] | 已跟踪来源的主机阻止列表(优先于允许列表)。 |
| offline | false | 离线模式:不碰 ctx.web,只用本地工作区数据。 |
| skillsDir | _(未设置)_ | 显式覆盖技能根目录;默认用打包的 skills/。 |
| track.maxResultsPerTopic | 10 | 每个主题的 web_search maxResults。 |
| track.maxFetchesPerCall | 10 | 每次 industry_track 调用的快照抓取预算。 |
| scan.maxFileBytes | 1048576 | 公司数据文件单文件读取上限。 |
| scan.maxFigureCandidates | 100 | 每次公司扫描的图表候选预算。 |
| scan.strictTicker | true | 公司卡片股票代码必须匹配内置格式(A 股 6 位数字,美股 1–5 个字母,港股 1–5 位数字);设为 false 跳过格式检查。 |

工具与接口

industry_map({ industry, seed?, seedFiles?, web?, chain?, renderSvg?, depth? })

带 chain 调用时:执行校验(悬空边、无来源的值、非法层级、重复 id、status/statusAsOf、未知 taxonomyCode —— 校验失败会直接报错,并给出完整问题列表),然后持久化 chain.json,再列出显式缺口槽位和瓶颈节点。不带 chain 调用时:返回当前图谱、已注册来源,以及可选的 ctx.web 产业链结构摘要,方便模型迭代。传入 renderSvg: true 时还会写出确定性的 chain.svg。depth(quick/standard/comprehensive)用来调节 web 辅助的力度。返回相对上一份 research-state.json 的 delta 摘要。发出 industry-research/map。

industry_track({ industry, topics?, since?, depth?, evidenceCategory? })

通过 ctx.web 逐个搜索每个 topic,按允许/屏蔽列表和 since 过滤,在调用预算内抓取页面快照(SHA-256),再合并进 timeline.jsonl(按规范化 URL 去重,有上限)。depth 调节来源/抓取预算;evidenceCategory 给每条追加记录打标签,并按六类枚举校验。快照抓取失败的来源保留为仅引用条目,原因写在 note 里。返回相对上一份 research-state.json 的 delta 摘要。ctx.web 未挂载或 offline: true 时直接报错,并指明缺失的能力。发出 industry-research/track。

company_scan({ name | companies, dataFiles?, web?, status?, statusAsOf?, ticker?, metrics?, depth?, parallel? })

读取工作区数据文件(.md/.txt/.csv/.tsv/.json;v1 不解析 PDF),计算哈希,提取 Markdown 大纲和图表候选行,可选挂上 ctx.web 引用,然后持久化卡片。传 status 时必须同时给一个不晚于当前时间的 statusAsOf;ticker 必须匹配内置格式,除非 scan.strictTicker: false;每个 metrics 值都必须带 source + asOf。companies(批量)会隔离单个出错的公司,不中断整批;挂载了 ctx.jobs 时,parallel: true 会把每家公司分发成独立任务(否则回退为串行,并在结果的 mode 里说明)。被拒绝的文件会连同原因一起返回;卡片无法确认的内容一律记为显式缺口。

industry_report({ industry, sections?, companies?, draft? })

汇总证据(E-chain、E-timeline、E-company-<slug>),对照 versions.jsonl 校验读取到的产物(哈希不匹配就报错),然后二选一:校验你的 draft(章节 + 论断;每条论断的 evidenceIds 必须指向已登记的证据),或者生成机械化的自动草稿(有来源的指标和近期时间线条目变成论断,按 evidenceCategory 分组)。生产前先跑一遍确定性的交付契约,缺块、占位符、无来源或无日期的断言一律报错。确定性的对抗式机器检查始终运行;挂载了 ctx.jobs 时,会派生红队评审任务(red-review-note.md),否则输出 review: skipped(jobs unavailable)。确定性的多空(正反方)综合会把多视角章节写进报告,并在挂载了 ctx.jobs 时派生辩论任务(perspectives-note.md)。引擎路径:密封目录 + sealHash + 逐条论断裁定。回退路径:带版本的 Markdown + manifest,论断如实标记为 unverified。输出 industry-research/report。

技能

- industry-research-method —— 行业研究方法论:上游/中游/下游拆解、供需框架、来源纪律(每个数字都要有:值 + 单位 + 来源 + asOf)、缺口声明纪律(只声明,不编造)。
- company-research-method —— 公司研究方法论:业务结构 / 财务 / 风险卡片框架、公开来源优先级清单(公司披露 → 监管机构 → 权威媒体)、合规措辞。

两者都通过标准 skill 工具按需加载(加载 industry-research-method 技能)。

数据布局

<workspace>/<industryRoot>/versions.jsonl artifact version ledger (SHA-256 + timestamp + change)
<workspace>/<industryRoot>/<industry>/research-state.json research-state memory
<workspace>/<industryRoot>/<industry>/chain.json industry_map
<workspace>/<industryRoot>/<industry>/chain.svg industry_map (renderSvg: true)
<workspace>/<industryRoot>/<industry>/timeline.jsonl industry_track
<workspace>/<industryRoot>/<industry>/sources.json citable source registry (S1, S2, …)
<workspace>/<industryRoot>/<industry>/notes/ seed notes
<workspace>/<industryRoot>/<industry>/red-review-note.md industry_report (red-team review, jobs)
<workspace>/<industryRoot>/<industry>/perspectives-note.md industry_report (bull/bear debate, jobs)
<workspace>/<industryRoot>/<industry>/reports/<ts>/ industry_report (report.md + manifest.json)
<workspace>/<industryRoot>/companies/<name>/card.* company_scan

权限与数据

dsh-industry-research 只使用公开接口:ctx.tools、ctx.skills,以及按需查找的 ctx.web 和 ctx.researchReport。它自己不访问网络(所有检索都走 ctx.web,服务商由部署方选定,超时按你的配置),不保存任何凭据,只写入会话工作区内 industryRoot 目录下的文件。只使用公开来源;付费来源和需要登录的来源不在范围内——请把你自己的导出文件作为 dataFiles 传入。

安全边界

- 工作区隔离——行业名和公司名会作为路径片段校验;数据文件会对照会话 cwd 做包含性检查(两侧都解析为真实路径)。
- 来源可追溯——来源自带 SHA-256 哈希;没有来源的数字会报校验错误;损坏的时间线行会被跳过,并给出跳过条数,绝不静默忽略。
- 如实降级——缺少 ctx.web / ctx.researchReport 时会明确报错,或产出如实标注的降级产物,绝不静默编造。
- 注册可撤销——所有注册都走 ctx.effect() / ctx.on() / register()。
- 仅限研究用途的合规要求——工具描述、卡片和报告都带有「仅供研究,不构成投资建议」;数据点带有 asOf 和来源。

已知限制

- 事件走 Cordis,不进会话日志——industry-research/* 事件是 Cordis 的可观测性事件,不会追加到会话日志;持久记录就是工作区里的产物本身,模型可见的工具结果则走持久的 tool/result 会话事件。
- 不写 ctx.attachment——rc2 的附件接口只接受图片(PNG/JPEG/WebP/GIF);因此 Markdown 报告仍作为带版本的工作区文件保存,在工具结果中以绝对路径引用。
- v1 只读文本格式——不解析 PDF;请用户先把 PDF 转成文本或 Markdown。
- 技能为中文版——随包提供的方法论技能是中文的;英文版留待后续。
- 工具在前台运行——industry_track 受 track.maxFetchesPerCall 和 fetchTimeoutMs 限制,在前台运行;后台任务模式留待后续。
- 自动草稿是机械生成的——它汇总产物,把有来源的数据点转成论断;叙述质量取决于模型撰写的 draft。

开发

pnpm install
pnpm run typecheck && pnpm run typecheck:ci
pnpm test
pnpm run build
pnpm run verify:self-contained && pnpm run verify:artifacts
pnpm run verify:readme-sync
pnpm run verify:skills
pnpm run pack:check

主题

dsh, dsh-plugin, deepseek-harness, cordis, industry-research, company-research, research, report

贡献者

- 初始设计与实现:dsh-industry-research 开发会话(DeepSeek Harness)。

欢迎外部贡献——提 issue 或 pull request 即可。
适用 DSH 版本: 已对照 dsh-v0.2.1-alpha.1 验证(本次构建面向的宿主版本);要求 >=0.1.7-alpha.1 <0.2.0。

PerryLink DSH 插件家族

本项目属于 PerryLink 的 DeepSeek Harness 插件家族。下方名单默认折叠,好让每个 README 的首屏都保持简短;展开即可查看每一行及其状态。

展开全部插件

| 插件 | 状态 |
| dsh-aqua-input-check | |
| dsh-archive-check | |
| dsh-auto-review | |
| dsh-autotier | |
| dsh-bid-ca-precheck | |
| dsh-bid-qual-check | |
| dsh-cert-mcp | |
| dsh-checkpoint-rewind | |
| dsh-click | |
| dsh-composer-history | |
| dsh-contract-stance | |
| dsh-customs-doc-check | |
| dsh-data-quality | |
| dsh-demurrage-ledger | |
| dsh-doublecheck | |
| dsh-drill-script-check | |
| dsh-eia-guide-check | |
| dsh-emergency-plan | |
| dsh-essay-rubric-check | |
| dsh-evidence-check | |
| dsh-export-ctl-check | |
| dsh-fast | |
| dsh-fmea-table-check | |
| dsh-forecast-penalty | |
| dsh-fund-research | |
| dsh-github | |
| dsh-gongwen-flow-check | |
| dsh-gongwen-word-check | |
| dsh-guard-plan-qc | |
| dsh-hazchem-check | |
| dsh-hazplan-check | |
| dsh-hidden-risk-map | |
| dsh-hs-classify | |
| dsh-icd-rule-check | |
| dsh-industry-research | |
| dsh-lawcite-adapter | |
| dsh-laya | |
| dsh-lc-doc-check | |
| dsh-learning-gap-check | |
| dsh-library | |
| dsh-local-ai | |
| dsh-lsp-actions | |
| dsh-mask | |
| dsh-mcp-panel | |
| dsh-medrec-qc | |
| dsh-memento | |
| dsh-nsfc-form-check | |
| dsh-nurse-record-check | |
| dsh-observe | |
| dsh-origin-rvc-check | |
| dsh-ota-review-check | |
| dsh-output-styles | |
| dsh-paper-doc-adapter | |
| dsh-permission-rules | |
| dsh-permit-report-check | |
| dsh-pipeline-check | |
| dsh-pleading-draft | |
| dsh-plugin-doctor | |
| dsh-plugin-guide | |
| dsh-plugin-kit | |
| dsh-plugin-upgrade | |
| dsh-policy-brief-draft | |
| dsh-power-loss-split | |
| dsh-power-ticket-check | |
| dsh-ppap-check | |
| dsh-protest-deadline | |
| dsh-railway-window | |
| dsh-repair-order-qc | |
| dsh-research-report | |
| dsh-review-reply-check | |
| dsh-rulefile-check | |
| dsh-safety-brief-check | |
| dsh-score | |
| dsh-session-sync | |
| dsh-site-log-check | |
| dsh-skill-pack-security | |
| dsh-soe-decision-check | |
| dsh-soilwater-check | |
| dsh-sop-sync-check | |
| dsh-spc-gbt-adapter | |
| dsh-talk | |
| dsh-tender-extract | |
| dsh-tender-matrix | |
| dsh-test-drive | |
| dsh-ticktick | |
| dsh-translate | |
| dsh-warranty-calc | |
| dsh-budget | 🧊 已冻结 — 见仓库 README |
| dsh-claude-move | 🧊 已冻结 — 见仓库 README |
| dsh-defend | 🧊 已冻结 — 见仓库 README |
| dsh-draw | 🧊 已冻结 — 见仓库 README |
| dsh-reach | 🧊 已冻结 — 见仓库 README |
| dsh-background-agents | 🚫 已退役 — 见仓库 README |
| dsh-session-pin | 🚫 已退役 — 见仓库 README |
| dsh-team-rooms | 🚫 已退役 — 见仓库 README |

许可证

Apache-2.0 — 见 LICENSE。
预览分享卡片长什么样 ↓PerryLink/dsh-industry-research
分享 · DeepSeek Harness Hub
PerryLink/dsh-industry-research

DeepSeek Harness 的行业与公司研究领域包:方法论技能、产业链梳理、公开来源政策/新闻追踪、公司研究卡片,以及可审计的研究报告。只做研究,不构成投资建议。

回到顶部