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

小桃子工具集 kedoupi/xiaotaozi-dsh

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

安装 xtz 命令,一键启动并管理插件与模型

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

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

自动兼容检查未通过:缺少 main/exports/bin 入口声明;仓库 package.json 标记 private,未发布到 npm,需从源码安装。以下命令仍可尝试,但可能失败。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add kedoupi/xiaotaozi-dsh
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:需留意
是什么
dsh 原生插件 · other
装得上吗
作者未把包发布到 npm,只能用源码安装
插件本身没问题,是分发方式不同
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 54 天前
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装

缺少 main/exports/bin 入口声明;仓库 package.json 标记 private,未发布到 npm,需从源码安装

展开查看检查明细 ↓

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

✗npm 包xiaotaozi-dsh(未发布到 npm,仅可源码安装)
✓Node 引擎要求 ^22.19.0 || >=24.0.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✗入口文件缺少入口声明

源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/12 15:08:38

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

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

可执行外部命令读写/删除本地文件读取剪贴板或密钥环境变量
查看扫描证据(共 122 处,展示前 116 条)
  • 读取本地文件
    apps/cli/src/app.ts:565
    const stats = await lstat(path);
  • 删除本地文件递归
    apps/cli/src/app.ts:773
    await rm(path, { recursive: true, force: true });
  • 写入本地文件
    apps/cli/src/app.ts:774
    await mkdir(dirname(path), { recursive: true });
  • 读取本地文件
    apps/cli/src/app.ts:1948
    await access(path);
  • 读取本地文件
    apps/cli/src/app.ts:2001
    return await readFile(path, "utf8");
  • 写入本地文件
    apps/cli/src/app.ts:2008
    ensureDirectory: async (path) => { await mkdir(path, { recursive: true }); },
  • 写入本地文件
    apps/cli/src/app.ts:2010
    await mkdir(dirname(path), { recursive: true });
  • 写入本地文件
    apps/cli/src/app.ts:2011
    await writeFile(path, text, options?.mode === undefined ? undefined : { mode: options.mode });
  • 写入本地文件
    apps/cli/src/app.ts:2014
    await mkdir(dirname(path), { recursive: true });
  • 写入本地文件
    apps/cli/src/app.ts:2016
    await writeFile(temporary, text, { flag: "wx", mode: 0o600 });
  • 删除本地文件
    apps/cli/src/app.ts:2024
    await unlink(temporary).catch(() => {});
  • 读取本地文件
    apps/cli/src/app.ts:2029
    return await readFile(path, "utf8");
  • 删除本地文件
    apps/cli/src/app.ts:2041
    await unlink(temporary).catch(() => {});
  • 读取本地文件
    apps/cli/src/app.ts:2046
    return await readFile(path, "utf8") === text;
  • 读取本地文件
    apps/cli/src/app.ts:2061
    if (await readFile(quarantine, "utf8") === text) return true;
  • 删除本地文件
    apps/cli/src/app.ts:2067
    await unlink(quarantine).catch(() => {});
  • 删除本地文件
    apps/cli/src/app.ts:2073
    await unlink(path);
  • 删除本地文件递归
    apps/cli/src/app.ts:2082
    removeTree: async (path) => { await rm(path, { recursive: true, force: true }); },
  • 读取本地文件
    apps/cli/src/metadata.ts:21
    const pkg = JSON.parse(await readFile(packageUrl, "utf8")) as PackageJson;
  • 执行外部命令来自配置/变量
    apps/cli/src/open-url.ts:10
    execFile(command, args, { windowsHide: true }, (error) => {
  • 读取本地文件
    apps/cli/src/profile-reconciliation.ts:72
    const entries = await readdir(dir, { withFileTypes: true });
  • 读取本地文件
    apps/cli/src/profile-reconciliation.ts:83
    snapshot[name] = createHash("sha256").update(await readFile(path)).digest("hex");
  • 读取本地文件
    apps/cli/src/profile-reconciliation.ts:100
    if ((await lstat(path)).isSymbolicLink()) throw new Error(`profile contains symlink: ${path}`);
  • 读取本地文件
    apps/cli/src/repo.ts:7
    await access(path);
  • 执行外部命令来自配置/变量
    apps/cli/src/runtime.ts:49
    execFile(
  • 读取本地文件
    apps/cli/src/runtime.ts:68
    readFile(`/proc/${pid}/stat`, "utf8"),
  • 读取本地文件
    apps/cli/src/runtime.ts:69
    readFile("/proc/sys/kernel/random/boot_id", "utf8"),
  • 读取本地文件
    apps/cli/src/runtime.ts:166
    const pkg = JSON.parse(await readFile(packagePath, "utf8")) as {
  • 执行外部命令来自配置/变量
    apps/cli/src/runtime.ts:201
    const child = spawn(launch.command, [...launch.prefixArgs, ...args], {
  • 执行外部命令来自配置/变量
    apps/cli/src/runtime.ts:275
    const child = spawn(launch.command, [...launch.prefixArgs, ...args], {
  • 执行外部命令来自配置/变量
    apps/cli/src/runtime.ts:295
    const child = spawn(launch.command, [...launch.prefixArgs, ...args], {
  • 写入本地文件
    plugins/im/src/journey-trace.ts:133
    await mkdir(dirname(file), { recursive: true });
  • 写入本地文件
    plugins/im/src/journey-trace.ts:134
    await appendFile(file, line);
  • 读取本地文件
    plugins/market/src/allow-builds.ts:140
    current = readFileSync(path, "utf8");
  • 写入本地文件
    plugins/market/src/allow-builds.ts:146
    mkdirSync(webProfileDir(env), { recursive: true });
  • 写入本地文件
    plugins/market/src/allow-builds.ts:147
    writeFileSync(path, next, "utf8");
  • 读取本地文件
    plugins/market/src/plugin-entry.ts:96
    pkg = JSON.parse(readFileSync(join(packageDir, "package.json"), "utf8"));
  • 读取本地文件
    plugins/market/src/plugin-entry.ts:108
    if (!existsSync(file)) {
  • 读取本地文件
    plugins/market/src/plugin-entry.ts:114
    if (clientFile !== null && existsSync(clientFile)) {
  • 读取本地文件
    plugins/market/src/plugin-entry.ts:117
    source = readFileSync(clientFile, "utf8");
  • 读取本地文件
    plugins/market/src/plugin-mutate.ts:73
    packageJson = JSON.parse(readFileSync(packagePath, "utf8")) as DshPackageJson;
  • 执行外部命令来自配置/变量
    plugins/market/src/plugin-mutate.ts:184
    const child = spawn(launch.command, [...launch.prefixArgs, ...args], {
  • 读取本地文件
    plugins/market/src/profile-deps.ts:22
    const parsed: unknown = JSON.parse(readFileSync(profilePackagePath(env), "utf8"));
  • 读取本地文件
    plugins/market/src/state-store.ts:16
    readText: (path) => readFileSync(path, "utf8"),
  • 写入本地文件
    plugins/market/src/state-store.ts:17
    ensureParent: (path) => mkdirSync(dirname(path), { recursive: true, mode: 0o700 }),
  • 写入本地文件
    plugins/market/src/state-store.ts:18
    writePrivate: (path, text) => writeFileSync(path, text, { encoding: "utf8", mode: 0o600 }),
  • 写入本地文件
    plugins/market/src/state-store.ts:19
    replace: (from, to) => renameSync(from, to),
  • 删除本地文件
    plugins/market/src/state-store.ts:20
    remove: (path) => rmSync(path, { force: true }),
  • 读取本地文件
    plugins/providers/src/index.ts:233
    const data = await readFile(join(videosDirectory(), name), { signal });
  • 写入本地文件
    plugins/providers/src/paths.ts:19
    await mkdir(dir, { recursive: true, mode: 0o700 });
  • 写入本地文件
    plugins/providers/src/paths.ts:21
    await chmod(dir, 0o700);
  • 读取本地文件
    plugins/providers/src/paths.ts:38
    await stat(dest);
  • 写入本地文件
    plugins/providers/src/paths.ts:41
    await copyFile(legacyPluginData(file), dest);
  • 写入本地文件
    plugins/providers/src/paths.ts:42
    await chmod(dest, 0o600);
  • 读取本地文件
    plugins/sidebar/src/agent-opens.ts:157
    info = await stat(target)
  • 启用终端会话(PTY)
    plugins/sidebar/src/agent-pty.ts:222
    const pty = this.nodePty.spawn(shell ?? this.shell, shellSpawnArgs(shellArgs ?? this.shellArgs), {
  • 读取本地文件
    plugins/sidebar/src/bundle-route.ts:51
    const info = await stat(path)
  • 读取本地文件
    plugins/sidebar/src/bundle-route.ts:56
    const etag = `"${shortHash(await readFile(path))}"`
  • 读取本地文件
    plugins/sidebar/src/bundle-route.ts:107
    const body = await readFile(join(chunkDir, `client-${name}.js`))
  • 读取本地文件
    plugins/sidebar/src/fs-operations.ts:42
    const info = await stat(safeTarget)
  • 写入本地文件
    plugins/sidebar/src/fs-operations.ts:48
    await mkdir(dirname(safeTarget), { recursive: true })
  • 写入本地文件
    plugins/sidebar/src/fs-operations.ts:59
    await rename(tmp, safeTarget)
  • 删除本地文件
    plugins/sidebar/src/fs-operations.ts:62
    if (owned) await rm(tmp, { force: true }).catch(() => {})
  • 写入本地文件
    plugins/sidebar/src/fs-operations.ts:92
    await mkdir(dirname(safeTarget), { recursive: true })
  • 写入本地文件
    plugins/sidebar/src/fs-operations.ts:93
    const stream = createWriteStream(tmp, { flags: 'wx' })
  • 写入本地文件
    plugins/sidebar/src/fs-operations.ts:114
    await rename(tmp, safeTarget)
  • 读取本地文件
    plugins/sidebar/src/fs-operations.ts:115
    const info = await stat(safeTarget)
  • 删除本地文件
    plugins/sidebar/src/fs-operations.ts:122
    await rm(tmp, { force: true }).catch(() => {})
  • 读取本地文件
    plugins/sidebar/src/fs-search.ts:85
    const level = await opendir(dir).catch(() => undefined)
  • 读取本地文件
    plugins/sidebar/src/fs-tree.ts:49
    level = await opendir(path)
  • 读取本地文件
    plugins/sidebar/src/fs-tree.ts:100
    const info = await stat(row.path).catch(() => undefined)
  • 执行外部命令固定命令
    plugins/sidebar/src/git.ts:163
    const child = spawn('git', full, {
  • 读取本地文件
    plugins/sidebar/src/git.ts:252
    const entries = await readdir(cwd, { withFileTypes: true }).catch(() => [])
  • 读取本地文件
    plugins/sidebar/src/index.ts:215
    if (await stat(sessionPath).then(() => true).catch(() => false)) return sessionPath
  • 读取本地文件
    plugins/sidebar/src/index.ts:233
    const info = await stat(path).catch((error: unknown) => {
  • 读取本地文件
    plugins/sidebar/src/index.ts:876
    const info = await stat(path)
  • 读取本地文件
    plugins/sidebar/src/index.ts:880
    const body = await readFile(path)
  • 读取本地文件
    plugins/sidebar/src/index.ts:932
    const info = await stat(absolute)
  • 读取本地文件
    plugins/sidebar/src/index.ts:936
    const body = await readFile(absolute)
  • 执行外部命令来自配置/变量
    plugins/sidebar/src/open-external.ts:86
    const child = spawn(spec.command, spec.args, { detached: true, stdio: 'ignore' })
  • 读取本地文件
    plugins/sidebar/src/path-security.ts:10
    return await realpath(path)
  • 读取本地文件
    plugins/sidebar/src/path-security.ts:59
    const realTarget = await realpath(existingPath)
  • 读取本地文件
    plugins/sidebar/src/pty-deps.ts:124
    return existsSync(join(dir, 'package.json')) && existsSync(join(dir, 'pnpm-workspace.yaml'))
  • 读取本地文件
    plugins/sidebar/src/pty-deps.ts:147
    if (!existsSync(file)) return false
  • 读取本地文件
    plugins/sidebar/src/pty-deps.ts:149
    const parsed = JSON.parse(readFileSync(file, 'utf8')) as { name?: unknown }
  • 读取本地文件
    plugins/sidebar/src/pty-deps.ts:188
    if (existsSync(script)) {
  • 读取本地文件
    plugins/sidebar/src/pty-deps.ts:193
    if (existsSync(script)) {
  • 写入本地文件
    plugins/sidebar/src/pty-manager.ts:38
    if (existsSync(helper)) chmodSync(helper, 0o755)
  • 读取本地文件
    plugins/sidebar/src/pty-manager.ts:38
    if (existsSync(helper)) chmodSync(helper, 0o755)
  • 启用终端会话(PTY)
    plugins/sidebar/src/pty-manager.ts:156
    pty: this.nodePty.spawn(shell ?? this.shell, shellSpawnArgs(shellArgs ?? this.shellArgs), {
  • 删除本地文件
    plugins/wecom-office/src/auth.ts:64
    await rm(join(configDir, "credentials.enc"), { force: true });
  • 删除本地文件递归
    plugins/wecom-office/src/auth.ts:65
    await rm(join(configDir, "cache"), { recursive: true, force: true });
  • 执行外部命令固定命令
    plugins/wecom-office/src/cli.ts:107
    const killer = spawn("taskkill", ["/pid", String(child.pid), "/T", "/F"], {
  • 读取本地文件
    plugins/wecom-office/src/im-bridge.ts:57
    const value: unknown = JSON.parse(await readFile(path, "utf8"));
  • 读取本地文件
    plugins/wecom-office/src/local-file-policy.ts:47
    canonicalWorkspace ??= await realpath(workspace);
  • 读取本地文件
    plugins/wecom-office/src/local-file-policy.ts:48
    if (!(await lstat(canonicalWorkspace)).isDirectory()) throw new OfficeError("local-file-denied", DENIED);
  • 读取本地文件
    plugins/wecom-office/src/local-file-policy.ts:49
    const canonical = await realpath(isAbsolute(path) ? path : resolve(canonicalWorkspace, path));
  • 读取本地文件
    plugins/wecom-office/src/local-file-policy.ts:50
    if (!strictChild(canonicalWorkspace, canonical) || !(await lstat(canonical)).isFile()) {
  • 读取本地文件
    plugins/wecom-office/src/local-file-policy.ts:75
    const currentPath = await realpath(sourcePath);
  • 读取本地文件
    plugins/wecom-office/src/local-file-policy.ts:76
    const current = await lstat(currentPath, { bigint: true });
  • 删除本地文件递归
    plugins/wecom-office/src/local-file-policy.ts:121
    if (stageRoot !== undefined) await rm(stageRoot, { recursive: true, force: true }).catch(() => {});
  • 写入本地文件
    plugins/wecom-office/src/local-file-policy.ts:128
    await mkdir(directory, { mode: 0o700 });
  • 写入本地文件
    plugins/wecom-office/src/office-controller.ts:173
    await mkdir(configDir, { recursive: true, mode: 0o700 });
  • 读取本地文件
    plugins/wecom-office/src/settings.ts:134
    return sanitizeOverlay(JSON.parse(await readFile(path, "utf8")));
  • 写入本地文件
    plugins/wecom-office/src/settings.ts:157
    await mkdir(dirname(path), { recursive: true, mode: 0o700 });
  • 写入本地文件
    plugins/wecom-office/src/settings.ts:161
    await writeFile(temporary, `${JSON.stringify(candidate, null, 2)}\n`, { mode: 0o600, flag: "wx" });
  • 写入本地文件
    plugins/wecom-office/src/settings.ts:163
    await rename(temporary, path);
  • 删除本地文件
    plugins/wecom-office/src/settings.ts:167
    await rm(temporary, { force: true }).catch(() => undefined);
  • 读取本地文件
    plugins/xtz-ui/src/dsh-home.ts:29
    if (existsSync(currentPath) || !existsSync(legacyPath)) return;
  • 写入本地文件
    plugins/xtz-ui/src/dsh-home.ts:30
    mkdirSync(dirname(currentPath), { recursive: true, mode: 0o700 });
  • 写入本地文件
    plugins/xtz-ui/src/dsh-home.ts:31
    copyFileSync(legacyPath, currentPath);
  • 读取密钥环境变量
    plugins/xtz-ui/src/host-routes.ts:33
    readInstanceToken: () => string | undefined = () => process.env.XIAOTAOZI_DSH_INSTANCE_TOKEN,
  • 读取本地文件
    plugins/xtz-ui/src/settings-store.ts:10
    const parsed: unknown = JSON.parse(readFileSync(path, "utf8"));
  • 写入本地文件
    plugins/xtz-ui/src/settings-store.ts:19
    mkdirSync(dirname(path), { recursive: true, mode: 0o700 });
  • 写入本地文件
    plugins/xtz-ui/src/settings-store.ts:21
    writeFileSync(tmp, `${JSON.stringify(pickFeaturePatch(config), null, 2)}\n`, { encoding: "utf8", mode: 0o600 });
  • 写入本地文件
    plugins/xtz-ui/src/settings-store.ts:22
    renameSync(tmp, path);
扫描于 2026/11/4(0 天前) · 范围 全包扫描 · 来源 GitHub 仓库

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

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 安装xtz命令
  • 一键启动插件
  • 管理插件与模型

xiaotaozi-dsh:小桃子 DeepSeek Harness 插件与 Mac 客户端

README

由 DeepSeek 最新模型翻译生成
xiaotaozi-dsh 小桃子 DSH:用户产品是 xtz CLI,外加一套 DeepSeek Harness 插件。 English ·中文 ·规范 ·流程 · DeepSeek Harness 小桃子 DSH 是建立在 DeepSeek Harness 上的产品套装:用户安装的是 apps/cli/ 里的 xtz 命令,plugins/ 是它种下的能力层。出了问题,或还缺某个插件?提个 issue。 快速开始 需要 PATH 上有 Node.js ^22.19.0 || >=24.0.0: npm install -g xiaotaozi-dsh-cli xtz start 第一次 xtz start 会准备好正式 web profile,把 plugins/ 下所有自研插件种好,然后在浏览器里打开界面。想用别的装法?安装脚本(curl -fsSL https://raw.githubusercontent.com/kedoupi/xiaotaozi-dsh/main/apps/cli/scripts/install.sh | sh)和 bun add -g xiaotaozi-dsh-cli 装的是同一个 CLI;xtz 运行仍是 Node。
展开完整文档(README 剩余 1 节)
xiaotaozi-dsh

小桃子 DSH:用户产品是 xtz CLI,外加一套 DeepSeek Harness 插件。

English ·中文 ·规范 ·流程 · DeepSeek Harness

小桃子 DSH 是建立在 DeepSeek Harness 上的产品套装:用户安装的是 apps/cli/ 里的 xtz 命令,plugins/ 是它种下的能力层。出了问题,或还缺某个插件?提个 issue。

快速开始

需要 PATH 上有 Node.js ^22.19.0 || >=24.0.0:

npm install -g xiaotaozi-dsh-cli
xtz start

第一次 xtz start 会准备好正式 web profile,把 plugins/ 下所有自研插件种好,然后在浏览器里打开界面。想用别的装法?安装脚本(curl -fsSL https://raw.githubusercontent.com/kedoupi/xiaotaozi-dsh/main/apps/cli/scripts/install.sh | sh)和 bun add -g xiaotaozi-dsh-cli 装的是同一个 CLI;xtz 运行仍是 Node。

开放命令:帮助/版本、start/web、stop、restart、open、status、config path、doctor。刻意禁用:init、plugin、run/ask、config dump/defaults、update。xtz 只管理自己拉起的进程,绝不抢占 3080 端口。完整命令和安全边界见 apps/cli/README.zh.md。CLI 固定 DeepSeek Harness @deepseek-ai/dsh@0.1.2-rc.1;其他 DSH 版本不视为兼容。

插件中心

从 新会话 下方的左侧工具条打开 插件中心。它占用会话主区域,侧栏和右侧工作台保持可用。
默认打开 已安装,内置能力为小桃子功能、侧边工作台、模型和 IM 机器人。
发现插件 使用精选目录。外部安装的顶层插件也会出现在已安装列表里,确认后可以移除。
移除包不承诺删除其凭据、会话或已保存数据。

首次欢迎确认打开 插件中心 → 已安装 → 模型。归档也可从会话 ⋯ 菜单打开。运行参数位于 设置 → 高级。技术 Loader 清单不是用户设置页;故障诊断使用 xtz doctor。

你会得到什么

- 模型 —— 官方订阅登录和 API Key 同一页,对话只列出勾选过的模型。
- IM 机器人 —— 九个聊天渠道(飞书、微信、Slack 等)和一个实验性 AI Office 连接器,完整嵌入插件中心。
- 企业微信办公 —— 通过官方 wecom-cli 使用日程、文档、会议、通讯录、表格、待办和微盘。
- 小桃子壳 —— 品牌界面和欢迎说明保持开启;开关覆盖归档、Git 图谱和向 Agent 宣告。
- 侧边工作台 —— 右侧面板里的文件、编辑器、Git 和终端。
- 插件中心 —— 内置配置、已安装插件和精选发现,一键安装。

看看小桃子 DSH

Web 应用第一次打开时,欢迎弹框向用户问好。

小桃子 DSH 欢迎弹框

插件中心 → 已安装 → 小桃子功能 开关覆盖归档、Git 图谱和向 Agent 宣告。

插件中心里的小桃子功能开关

Git 图谱标出当前提交、分支引用和合并泳道,不替代 Host 原有 Git 工作流。

小桃子 Git 图谱

右侧工作台把文件留在会话旁边;会话上还有 Git 图谱胶囊。

对话旁的 Sidebar 文件栏

插件中心 → 已安装 → 模型 展示已接入的服务商、可选的智能选择,以及对话会提供的模型。

模型总览与模型选择

添加服务商列出用户还可以登录或填密钥的所有厂商。

添加服务商目录

插件中心 → 已安装 → IM 机器人 列出聊天渠道;微信默认扫码接入。

插件中心里的 IM 机器人:微信选中

手动接入 Telegram 机器人只需要 Bot Token;凭据保存在 Host 凭据存储,而不是客户端包。

手动接入机器人:粘贴 Bot Token

插件中心 → 发现插件 列出精选第三方插件,支持搜索和标签。

发现插件:搜索、标签和插件卡片

插件详情页展示版本、来源和确切的安装规格。

插件详情:版本、来源和安装规格

插件

一个包做一件事;每个自研插件都会在第一次 xtz start 时种好。每个插件也都能用 github:kedoupi/xiaotaozi-dsh#path:plugins/ 的 Git 路径单独构建安装。

| 包 | 占用 | 做什么 | Git 路径安装 |
| dsh-providers | 插件中心 → 已安装 → 模型 | 服务商登录、API Key、模型勾选和可选智能选择(无在线学习、reasoning effort 路由、耐久路由审计)。EN · | github:kedoupi/xiaotaozi-dsh#path:plugins/providers |
| dsh-im | 插件中心 → 已安装 → IM 机器人 | 九个聊天渠道和实验性 AI Office 连接器。EN · | github:kedoupi/xiaotaozi-dsh#path:plugins/im |
| dsh-wecom-office | 插件中心 → 已安装 → IM 机器人 → 企业微信机器人卡片 | 通过 wecom-cli 接企业微信日程、文档、会议、通讯录、表格、待办和微盘。EN · | github:kedoupi/xiaotaozi-dsh#path:plugins/wecom-office |
| dsh-xtz-ui | 插件中心 → 已安装 → 小桃子功能;设置 → 高级 | 品牌壳、归档、Git 图谱和功能开关。EN · | github:kedoupi/xiaotaozi-dsh#path:plugins/xtz-ui |
| dsh-sidebar | 插件中心 → 已安装 → 侧边工作台 | 右侧文件 / 编辑器 / Git / 终端面板。EN · | github:kedoupi/xiaotaozi-dsh#path:plugins/sidebar |
| dsh-market | 插件中心 | 已安装能力与 发现插件;点 安装 添加第三方插件。EN · | github:kedoupi/xiaotaozi-dsh#path:plugins/market |

第三方市场

插件中心 → 发现插件 从第三方插件的上游 Git/npm 源安装;本仓库只保存 plugins/market 里的目录行(MARKET_PLUGINS),从不 vendor 那些仓库。当前收录:Agent Teams、会话上下文 和 OpenContext。

正式环境与沙箱

两套 Harness 家目录,绝不混用:

| | 正式(用户) | 沙箱(插件开发) |
| 家目录 | ~/.dsh | /.dsh-home(gitignore) |
| 命令 | xtz start | pnpm dev |
| 端口 | 3080 | 3081 |
| 插件 | 第一次 xtz start 种好;额外插件用 dsh plugin --profile web add | 从本仓库 link: |

xtz 和正式安装绝不碰沙箱;沙箱工具也绝不碰 ~/.dsh。

继续了解

- 贡献入口:CONTRIBUTING.zh.md;给 agent 的硬性规则:AGENTS.md
- 规范:docs/conventions.zh.md;流程:docs/workflow.zh.md;文档地图:docs/README.zh.md
- 产品快照:CHANGELOG.md;锁定版本:versions.json
- CLI 合同与源码:apps/cli/

License

MIT
预览分享卡片长什么样 ↓kedoupi/xiaotaozi-dsh
分享 · DeepSeek Harness Hub
kedoupi/xiaotaozi-dsh

安装 xtz 命令,一键启动并管理插件与模型

这是你的仓库?认领条目

回到顶部