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

严格代理工作流 l246804/dsh-pstack

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

把 pstack 的严谨代理工作流搬进 DSH 使用

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

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

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

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么
dsh 原生插件 · market
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 0 天前
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

可执行外部命令读写/删除本地文件
查看扫描证据(共 56 处,展示前 52 条)
  • 读取本地文件
    playground/browser.mjs:69
    readFileSync(fileURLToPath(import.meta.url), "utf8")
  • 读取本地文件
    playground/browser.mjs:89
    if (existsSync(root)) {
  • 读取本地文件
    playground/browser.mjs:90
    for (const name of readdirSync(root)) {
  • 读取本地文件
    playground/browser.mjs:92
    if (existsSync(binary)) candidates.push({ name, binary });
  • 执行外部命令来自配置/变量
    playground/browser.mjs:100
    const result = spawnSync(BIN, args, { env, encoding: "utf8", maxBuffer: 32 * 1024 * 1024 });
  • 读取本地文件
    playground/browser.mjs:108
    if (!existsSync(BIN)) die(`agent-browser binary not found at ${BIN}; run \`vp install\``);
  • 写入本地文件
    playground/browser.mjs:117
    mkdirSync(RUNTIME_DIR, { recursive: true });
  • 写入本地文件
    playground/browser.mjs:124
    mkdirSync(env.HOME, { recursive: true });
  • 写入本地文件
    playground/browser.mjs:125
    mkdirSync(env.XDG_CONFIG_HOME, { recursive: true });
  • 写入本地文件
    playground/browser.mjs:126
    mkdirSync(env.XDG_RUNTIME_DIR, { recursive: true });
  • 写入本地文件
    playground/browser.mjs:177
    mkdirSync(dirname(out), { recursive: true });
  • 读取本地文件
    playground/run-cases.mjs:131
    if (!existsSync(opts.config)) {
  • 读取本地文件
    playground/run-cases.mjs:142
    doc = JSON.parse(readFileSync(opts.config, "utf8"));
  • 读取本地文件
    playground/run-cases.mjs:172
    if (!existsSync(HOME_PATCH)) {
  • 读取本地文件
    playground/run-cases.mjs:182
    entries = yaml.load(readFileSync(HOME_PATCH, "utf8"));
  • 写入本地文件
    playground/run-cases.mjs:276
    mkdirSync(join(PROFILE_DIR, "node_modules"), { recursive: true });
  • 写入本地文件
    playground/run-cases.mjs:287
    writeFileSync(join(PROFILE_DIR, "package.json"), `${JSON.stringify(manifest, null, 2)}\n`);
  • 读取本地文件
    playground/run-cases.mjs:291
    linked = lstatSync(link).isSymbolicLink() || lstatSync(link).isDirectory();
  • 读取本地文件
    playground/run-cases.mjs:363
    const previous = existsSync(ROLE_FILE) ? readFileSync(ROLE_FILE, "utf8") : null;
  • 写入本地文件
    playground/run-cases.mjs:366
    writeFileSync(ROLE_FILE, body);
  • 写入本地文件
    playground/run-cases.mjs:369
    if (previous !== null) writeFileSync(ROLE_FILE, previous);
  • 删除本地文件
    playground/run-cases.mjs:370
    else rmSync(ROLE_FILE, { force: true });
  • 执行外部命令来自配置/变量
    playground/run-cases.mjs:375
    const result = spawnSync(DSH_BIN, ["--profile", PROFILE_NAME, "--json", prompt], {
  • 写入本地文件
    playground/run-cases.mjs:479
    mkdirSync(REPORT_DIR, { recursive: true });
  • 写入本地文件
    playground/run-cases.mjs:498
    writeFileSync(path, body);
  • 读取本地文件
    playground/start.mjs:71
    if (reset && existsSync(PROFILE_DEST)) {
  • 删除本地文件递归
    playground/start.mjs:72
    rmSync(PROFILE_DEST, { recursive: true, force: true });
  • 写入本地文件
    playground/start.mjs:75
    mkdirSync(join(DSH_HOME, "profiles"), { recursive: true });
  • 读取本地文件
    playground/start.mjs:78
    const manifest = JSON.parse(readFileSync(manifestPath, "utf8"));
  • 写入本地文件
    playground/start.mjs:80
    writeFileSync(manifestPath, `${JSON.stringify(manifest, null, 2)}\n`);
  • 读取本地文件
    playground/start.mjs:87
    if (existsSync(source)) {
  • 读取本地文件
    playground/start.mjs:90
    } else if (!existsSync(dest)) {
  • 读取本地文件
    playground/start.mjs:103
    if (existsSync(source)) {
  • 读取本地文件
    playground/start.mjs:104
    body = extractPatchEntries(readFileSync(source, "utf8"), HOME_PATCH_IDS).join("\n");
  • 写入本地文件
    playground/start.mjs:107
    writeFileSync(dest, `${header}${body}\n`);
  • 写入本地文件
    playground/start.mjs:111
    writeFileSync(
  • 执行外部命令来自配置/变量
    playground/start.mjs:129
    const result = spawnSync(bin, ["plugin", "--profile", PROFILE_NAME, "install"], {
  • 执行外部命令来自配置/变量
    playground/start.mjs:165
    const child = spawn(
  • 读取本地文件
    src/internal/role-config.ts:93
    text = readFileSync(path, "utf8");
  • 写入本地文件
    src/internal/role-editor.ts:225
    mkdirSync(dirname(path), { recursive: true });
  • 写入本地文件
    src/internal/role-editor.ts:228
    writeFileSync(temporary, text, "utf8");
  • 写入本地文件
    src/internal/role-editor.ts:229
    renameSync(temporary, path);
  • 删除本地文件
    src/internal/role-editor.ts:231
    rmSync(temporary, { force: true });
  • 读取本地文件
    src/internal/role-editor.ts:260
    existing = readFileSync(path, "utf8");
  • 读取本地文件
    src/internal/skill-provider.ts:127
    entries = readdirSync(root, { withFileTypes: true });
  • 读取本地文件
    src/internal/skill-provider.ts:231
    return readFileSync(instructionFile, "utf8");
  • 读取本地文件
    src/internal/skill-provider.ts:256
    return readFileSync(instructionFile, "utf8");
  • 执行外部命令来自配置/变量
    src/script.ts:195
    const child = spawnChild(options.execPath ?? process.execPath, [path, ...args.args], {
  • 执行外部命令来自配置/变量
    src/script.ts:302
    child = spawnChild(execPath, [path, ...args.args], {
  • 读取本地文件
    src/skill.ts:139
    return { path: resource, content: await readFile(target, "utf8") };
  • 读取本地文件
    src/subagent.ts:627
    isDirectory = statSync(resolved).isDirectory();
  • 读取本地文件
    src/subagent.ts:646
    return existsSync(join(directory, ".git"));
扫描于 2026/11/3(0 天前) · 范围 全包扫描(包内未声明入口) · 来源 GitHub 仓库

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

依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-agent@deepseek-ai/dsh-jobs@deepseek-ai/dsh-llm@deepseek-ai/dsh-session@deepseek-ai/dsh-skill@deepseek-ai/dsh-subagent@deepseek-ai/dsh-system-prompt@deepseek-ai/dsh-tools@deepseek-ai/dsh-typert-protocol@deepseek-ai/dsh-working-directory@deepseek-ai/dsh-api-gateway@deepseek-ai/dsh-client-locale
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

pstack 是 DeepSeek Harness 的插件,把 cursor/plugins 里严谨的智能体工作流移植了过来。

README

由 DeepSeek 最新模型翻译生成
dsh-pstack 把 pstack 的严格代理工作流带进 DeepSeek Harness English · 中文 =0.2.1-rc.5" /> 58pstack 技能 23playbook 4原生工具 2agent preset 5随包脚本 快速开始 ·能力 · skills 目录 ·可选 DSH 插件 ·兼容性 dsh-pstack 是 pstack 的 DeepSeek Harness(DSH)移植。它保留上游 pstack 的技能、playbook 与参考文档。4 个原生工具替代 DSH 缺少的接口,适配层则把 Cursor 的工具名、子代理字段、模型 slug 和路径映射到 DSH。 上游 pstack 的技能大多声明 disable-model-invocation: true。poteto-mode 按名称路由到这些隐藏技能,但 DSH 的 skill 工具只暴露模型可见目录。DSH 也没有与 Cursor 的模型 slug、subagent_type、readonly 和 Bun 脚本对等的接口。dsh-pstack 在插件层处理这些差异,安装后可以从 /poteto-mode 开始工作。 完整能力映射、缺口和验收状态见 pstack/README.md。 [!
展开完整文档(README 剩余 1 节)
dsh-pstack

把 pstack 的严格代理工作流带进 DeepSeek Harness

English · 中文

=0.2.1-rc.5" />

58pstack 技能 23playbook 4原生工具 2agent preset 5随包脚本

快速开始 ·能力 · skills 目录 ·可选 DSH 插件 ·兼容性

dsh-pstack 是 pstack 的 DeepSeek Harness(DSH)移植。它保留上游 pstack 的技能、playbook 与参考文档。4 个原生工具替代 DSH 缺少的接口,适配层则把 Cursor 的工具名、子代理字段、模型 slug 和路径映射到 DSH。

上游 pstack 的技能大多声明 disable-model-invocation: true。poteto-mode 按名称路由到这些隐藏技能,但 DSH 的 skill 工具只暴露模型可见目录。DSH 也没有与 Cursor 的模型 slug、subagent_type、readonly 和 Bun 脚本对等的接口。dsh-pstack 在插件层处理这些差异,安装后可以从 /poteto-mode 开始工作。

完整能力映射、缺口和验收状态见 pstack/README.md。

[!IMPORTANT]
要求 DSH >=0.2.1-rc.5、Node.js >=24.21.1。默认支持更高版本的 DSH;只有确认不兼容的版本才会列入 兼容性。

快速开始

1. 安装插件:

dsh plugin --profile web add dsh-pstack

也可以在 Web 或 Desktop 的「插件」页面安装。

2. 重启对应的 profile,或新开一个 Session。

3. 首次使用前运行:

/setup-pstack

该命令读取当前部署提供的 provider、model 与 reasoning effort,并写入 $DSH_HOME/pstack-models.mdc。缺少这个文件时,所有角色继承父级路由。初始化后可在 插件 → 已安装插件 → dsh-pstack 查看和编辑同一份配置。

常用入口

| 命令 | 用途 |
| /poteto-mode | 主工作流入口,按任务匹配 playbook,维护 todo 与证据 |
| /setup-pstack | 配置角色模型,初始化 pstack 使用环境 |
| /how、/why、/teach | 架构走查、证据调查、渐进式讲解 |
| /architect、/arena、/swarm | 多方案设计、并行候选、切片并行实现 |
| /create-verification-skill | 为真实项目生成验证技能 |
| /statechart | 用 TLA+ 与 TLC 检查状态模型,输出 Mermaid 状态图 |
| /show-me-your-work | 维护 TSV 决策日志,审计当前工作 |
| /retro | 对一次编码会话做环境复盘 |
| /docs-drift | 巡检项目自身指针发现的文档;report 只读,fix 仅修复获批项。 |

能力

原生工具

| 工具 | 作用 |
| pstack_skill | 按名称加载本插件注册的隐藏技能,也能读取技能目录内的相对资源。 |
| pstack_models | 只读列出 DSH 实际提供的 provider、model 和 effort,供 /setup-pstack 使用。 |
| pstack_roles | 只读列出每个 pstack 角色的 shape 与是否为自动面板,帮助 pstack_subagent 调用传对 roleIndex。 |
| pstack_subagent | 按角色读取 $DSH_HOME/pstack-models.mdc,解析 provider/model [effort],按 agent 选择 preset,一次可启动多个子代理。 |
| pstack_script | 用固定 id 运行随包 Node 脚本,不依赖 Bun 或 shell 脚本。 |

poteto-agent 和 comment-sicko 两个 preset 分别负责实现型委派与只读评论审查。pstack_script 可以运行 check-plan、watch-pr、worktree-audit、log、statechart 五个随包脚本,脚本 id 是封闭枚举,不能拼任意路径。

插件配置入口

在插件页头右上角点击「配置」入口

打开 插件 → 已安装插件 → dsh-pstack,点击 bundle 页头右上角的 配置 按钮即可打开配置弹窗。

skills 目录

skills/ 不是 pstack 上游目录。它只收 pstack 没提供、真实项目开发中又需要的技能。源目录是 skills/authored/ 和 skills/.agents/skills/,构建后分别发布到 dist/skills/authored/ 和 dist/skills/vendored/。vendored 逐字保留开源上游,authored 由本仓维护。pstack 技能对它们的引用只是使用关系,不改变收录标准。

| 来源 | 技能 | 作用 | 补充的工程能力 |
| vendored | writing-for-agents | 写技能、AGENTS.md、CLAUDE.md 与被指针引用的文档,覆盖 context pointer、信息层级和渐进披露。 | 让 agent 文档的触发词、加载顺序和上下文成本可预测,也补上 Cursor create-skill 的写作路径。 |
| vendored | retro | 对一次编码会话做环境复盘,检查导航、自动化检查、编码规范、工具经济与信息获取。 | 补上 pstack /reflect、/correct 没覆盖的环境体检,只出报告,不改仓库。 |
| authored | decision-write | 决策记录的写入、落地和取代,Draft 与 Land 两种模式,Status 与 Implemented-by 必须成对。 | 补上真实项目常缺的决策生命周期。 |
| authored | decision-audit | 只读审计决策记录的路由、状态、Scope、锚点与取代关系。 | 让决策记录持续可检索、可复核。 |
| authored | setup-project-docs | 搭建 architecture、glossary、decisions 与根 AGENTS.md 指针,可重复补齐。 | 给新项目一套可持续的项目文档入口。 |
| authored | docs-drift | 从项目指针发现维护文档,检查实现漂移、矛盾、术语、链接、冗余与无依据扩写,仅修复获批项。 | 不依赖固定文档布局,补充周期性文档巡检与受控清理。 |

vendored 技能来自 mattpocock/skills@59db609eb1e18aaf59b63284d0e52255aff0c63c,来源、路径和哈希记录在 skills/skills-lock.json。两棵技能树都随包发布,但和 pstack 上游版本没有对应关系。

可选 DSH 插件

以下插件随 DSH 提供,默认关闭。安装 dsh-pstack 时不要求安装这些插件,但部分 pstack 流程需要它们才能完整执行。要启用插件,在「插件」页面用添加插件输入包名。也可以运行 dsh plugin --profile <profile> add <package>,然后重启 profile。除 @deepseek-ai/dsh-mcp-client 外,本节列出的 bundle 与 provider 都是实验性的。

[!NOTE]
未启用可选插件时,pstack 技能仍可加载。需要插件的步骤会输出 Skipped in DeepSeek Harness: <step>. <reason>. 后继续。缺少 gh、Java/TLC 或视频工具时,对应步骤会报告 blocked 或降级为截图。dsh-pstack 不会把未运行的步骤标记为通过。

会话与隔离

| 插件 | 打开后的能力 | 边界与冲突 |
| @deepseek-ai/dsh-experimental-session-search | 5 个只读工具:session_search、session_event_search、session_trace、session_event_trace、session_event_read,搜索和追踪历史会话,服务 /recall、/reflect、/show-me-your-work。 | 只匹配同一 cwd 的会话;当前会话用 session_event_search;没有 Cursor 的 .jsonl 转写路径。 |
| @deepseek-ai/dsh-experimental-worktree@deepseek-ai/dsh-experimental-tool-worktree | create_worktree 建本地分支和工作树,切换当前 Session 目录,用于 /arena、/swarm、/architect 的并行候选隔离。 | from 只读本地 ref,不 fetch;无云 VM;连续建树会改 cwd;不会自动给每个子代理分树。 |
| @deepseek-ai/dsh-experimental-forge-bundle | PR 面板、checks、review、mark ready、merge、Session 绑定,也能从 composer 用新 worktree 启动 Session,服务 /babysit、/shipping、/autopilot-。 | 仅 GitHub,需 gh 登录;模型侧没有 take 工具;没有 stack verdict,也没有 origin CLI;可与 worktree bundle 共存。 |

验证与证据

浏览器 provider 三选一:@deepseek-ai/dsh-experimental-browser-use-stagehand-native、@deepseek-ai/dsh-experimental-browser-use-playwright-mcp、@deepseek-ai/dsh-experimental-browser-use-chrome-devtools-mcp。

| 插件 | 打开后的能力 | 边界与冲突 |
| @deepseek-ai/dsh-browser-use + 一个 provider | 导航、点击、输入、截图和 ARIA snapshot;Stagehand 另有 act、find、extract,用于验证技能和 UI 复现。 | 基础包没有 provider 时不生效;每个 Session 一个 provider;截图要图像模型;无视频;Stagehand 需要 Chromium 和非 DeepSeek 模型。 |
| @deepseek-ai/dsh-cua-bundle | macOS 应用点击、输入、截图和权限页,用于桌面应用验证。 | 仅 macOS PTC;Windows 未完成;无视频。 |
| @deepseek-ai/dsh-experimental-terminal-bundle | 6 个全局终端工具,跨调用保持 shell / REPL,支持后台 send,用于 CLI / TUI 验证。 | 只覆盖终端;会加到所有 Agent;持久状态要清理;切换会失效 KV cache。 |
| @deepseek-ai/dsh-mcp-client | 挂载 MCP server,工具以 mcp__<server>__<tool> 出现,mcp-resources 列出带资源的 server,服务 /why、/teach 的证据调查。 | 无默认 server;需逐项配置;无自动类别发现。 |

多代理

| 插件 | 打开后的能力 | 边界与冲突 |
| @deepseek-ai/dsh-experimental-agent-team-profile | Lead / teammate、共享任务板、9 个团队工具和 Web roster,服务 /orchestrate、/autopilot-。 | 禁用 subagent 和 subagent_fork,与 pstack_subagent 冲突。见下方警告。 |
| @deepseek-ai/dsh-experimental-ralph-bundle | 全局 ralph,每轮 fresh child 的 foreground 循环,服务 /autonomous-run。 | 不是同一 Session 常驻循环;无事件 watcher;不替代 goal、心跳和 decision log。 |

[!WARNING]
不要在同一 profile 中同时启用 @deepseek-ai/dsh-experimental-agent-team-profile 和 pstack_subagent。agent team 插件会禁用 subagent 和 subagent_fork,并提供另一套委派入口。每个 profile 只使用一套子代理系统。

兼容性

| 项目 | 版本 | 说明 |
| DSH | >=0.2.1-rc.5 | 最低支持版本;已验证至 0.2.2-alpha.2 基线 |
| pstack | 0.15.36 | 上游基线提交 4dd1d05 |
| Node.js | >=24.21.1 | 运行时要求 |
| Cordis | ~4.0.6-alpha.1 | peer dependency |

[!NOTE]
DSH 版本支持: engines.dsh 接受所有 >=0.2.1-rc.5 的版本,包括更高的预发布版。DSH 正常升级时无需修改此处;只有确认某个版本不受支持时才添加条目,只有移植修复需要时才提高最低版本。

已知不兼容的 DSH 版本: 暂无。

升级 DSH 前,先在测试 profile 中验证实验性插件的包名、工具名和配置。升级上游 pstack 需要重新生成树并复核适配表。

[!CAUTION]
pstack_script 使用 Host 的 Node 运行,会绕过 bash 审批和文件系统沙箱。请将其视为受信入口。

worktree Session 的 cwd 与原 Session 不同。session-search 插件只匹配完全相同的 cwd,因此要在原目录搜索旧 Session。

实现方式

上游 pstack 用 docs/harness/claude-code.md 适配 Claude Code。它保留技能正文,另用宿主适配表把 Task、AskQuestion、todo、模型 slug 和路径映射到目标宿主。生成器为使用 Cursor 名称的技能添加一行 Claude Code 适配提示。不支持的能力会报告 Skipped in Claude Code: <step>. <reason>.

dsh-pstack 沿用这套做法。主适配文档是 pstack/harness/docs/harness/dsh.md,覆盖 Tools、Subagent fields、Models、setup-pstack、Paths 和 Cursor-only features。pstack_ 工具、agent preset 和 Node 脚本替代 DSH 缺少的字段。构建时,上游 pstack 与本地适配树被渲染到 pstack/pstack/,再与 src/.ts、skills/ 一起打包到 dist/。

鸣谢

- pstack 由 Lauren Tan 与 Cursor 团队设计并开源。poteto-mode、23 个 playbook 和 24 条 principle 都来自上游。
- DeepSeek Harness 由 DeepSeek 团队提供。DSH 的插件、bundle、agent preset、subagent 和工具宿主接口让这次移植能以原生工具落地。
- mattpocock/skills 提供 vendored 的 writing-for-agents 与 retro。

本项目是社区移植,不是 Cursor 或 DeepSeek 官方发行。上游 pstack 与 DSH 均为 MIT License。

License

MIT License © leiwang
预览分享卡片长什么样 ↓l246804/dsh-pstack
分享 · DeepSeek Harness Hub
l246804/dsh-pstack

把 pstack 的严谨代理工作流搬进 DSH 使用

回到顶部