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

GitHub 同步发布 s-huizhuy-u/dsh-github-sync

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

一句话把工作区建仓提交并推送到 GitHub

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

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

自动兼容检查有告警:未发布到 npm registry,仅可从源码安装。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add s-huizhuy-u/dsh-github-sync
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么[目录]—
dsh 原生插件 · market
暂无时间戳·判据 →
装得上吗[实装验证]✓
本站已真实安装成功
非静态推断
L4 · 真实安装等级说明 →
数据截至 2026/09/26·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/04·判据 →
还在维护吗[仓库]—
更新放缓:最近一次提交在 39 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

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

验证判据与等级说明 →

可信度证据

安装兼容性检查⚠ 装前注意

未发布到 npm registry,仅可从源码安装

展开查看检查明细 ↓

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

✗npm 包dsh-github-sync(未发布到 npm,仅可源码安装)
✓Node 引擎要求 >=20.12 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

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

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

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 10 处,展示前 10 条)
  • 读取本地文件
    lib/exec.js:57
    if (typeof cwd === 'string' && !existsSync(cwd)) {
  • 执行外部命令来自配置/变量
    lib/exec.js:63
    execFile(
  • 发起网络请求
    lib/github.js:66
    response = await fetch(`${API_ORIGIN}${path}`, {
  • 读取本地文件
    lib/workspace.js:37
    root = await realpath(cwd)
  • 读取本地文件
    lib/workspace.js:45
    const info = await lstat(root)
  • 读取本地文件
    lib/update-notice.js:22
    if (!existsSync(noticePath)) return undefined
  • 读取本地文件
    lib/update-notice.js:24
    const parsed = JSON.parse(await readFile(noticePath, 'utf8'))
  • 读取本地文件
    lib/dsh-home.js:49
    existsSync(path.join(candidate, 'profiles', profile, 'package.json')))
  • 读取本地文件
    lib/dsh-home.js:53
    const existing = candidates.find((candidate) => existsSync(candidate))
  • 读取本地文件
    lib/dsh-home.js:56
    const existing = candidates.find((candidate) => existsSync(candidate))
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

社区实装还没有人打卡 · 装过的第一个就是你
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-credentials@deepseek-ai/dsh-settings@deepseek-ai/dsh-tools@deepseek-ai/dsh-util-workspace-path@deepseek-ai/schemastery
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 工作区建仓推送
  • 初始化git提交
  • token存入凭据库

把 DeepSeek Harness 工作区发布到 GitHub:建仓库、初始化 git、提交并推送,token 存在 DSH 凭据库里。

README

由 DeepSeek 最新模型翻译生成
dsh-github-sync 在对话里把 DeepSeek Harness 工作区发布到 GitHub。 让助手同步项目,它会创建仓库、在工作区初始化 git、提交整棵工作树并推送。仓库名默认取项目文件夹名,可见性默认私有,两者都可以在单次调用时或在设置里覆盖。 你: 把这个项目传到 GitHub DSH: 已同步 12 个变更文件到 octocat/my-project(分支 main)。 仓库:https://github.com/octocat/my-project 功能 | 能力 | 说明 | | 创建仓库 | GitHub 上不存在就创建,已存在则复用 | | 初始化 git | 沿用项目当前所在分支;新仓库用 main | | 提交 | 暂存整棵工作树并提交;没有变更时复用现有 HEAD,而不是报错 | | 推送 | 历史分叉时先 fetch + rebase 再推送 | | 自动配置 | 写入账号的提交身份,并把分支上游记录下来 | | 只读预览 | github_status 报告同步将要做什么,不改动任何东西 | 环境要求 - DeepSeek Harness 0.1.5-rc.2 或更高 - Node.js 20.12+(需要 AbortSignal.any) - PATH 中有 git 安装
展开完整文档(README 剩余 1 节)
dsh-github-sync

在对话里把 DeepSeek Harness 工作区发布到 GitHub。

让助手同步项目,它会创建仓库、在工作区初始化 git、提交整棵工作树并推送。仓库名默认取项目文件夹名,可见性默认私有,两者都可以在单次调用时或在设置里覆盖。

你: 把这个项目传到 GitHub

DSH: 已同步 12 个变更文件到 octocat/my-project(分支 main)。
仓库:https://github.com/octocat/my-project

功能

| 能力 | 说明 |
| 创建仓库 | GitHub 上不存在就创建,已存在则复用 |
| 初始化 git | 沿用项目当前所在分支;新仓库用 main |
| 提交 | 暂存整棵工作树并提交;没有变更时复用现有 HEAD,而不是报错 |
| 推送 | 历史分叉时先 fetch + rebase 再推送 |
| 自动配置 | 写入账号的提交身份,并把分支上游记录下来 |
| 只读预览 | github_status 报告同步将要做什么,不改动任何东西 |

环境要求

- DeepSeek Harness 0.1.5-rc.2 或更高
- Node.js 20.12+(需要 AbortSignal.any)
- PATH 中有 git

安装

把包复制进 DSH profile 并完成声明:

node scripts/install.mjs

脚本会先定位 DSH home(依次检查 DSH_HOME、各平台默认路径、~/.dsh),把插件复制到 /.local-plugins/ 和 /node_modules/,加入 dsh.profile.bundles,并把加载行追加到 cordis.patch.yml。脚本可重复执行,并会打印每一个写入路径。

dsh-github-sync installer
source /path/to/dsh-github-sync
DSH home ~/.config/dsh-desktop/harness (holds profiles/web/package.json)
profile ~/.config/dsh-desktop/harness/profiles/web

wrote .../profiles/web/.local-plugins/dsh-github-sync
wrote .../profiles/web/node_modules/dsh-github-sync
updated .../profiles/web/package.json
updated .../profiles/web/cordis.patch.yml

重启 DSH 以加载插件。

DSH 桌面版存在不止一个可能的 home —— 启动器会导出 DSH_HOME,而 CLI 版默认用 ~/.dsh。脚本只接受真正含有 profile 清单的目录,--home 可覆盖探测结果。

认证

需要一个 GitHub personal access token。

按优先级有三种提供方式:

1. 环境变量 —— GITHUB_TOKEN,其次 GH_TOKEN。不在磁盘上留下任何东西,是 CI 和共享机器上的最佳选择。
2. 让助手存 —— 说「存一下我的 GitHub token」,它会用 github_configure 存储。
3. HTTP —— POST /api/github-sync.token,body 为 {"token": "..."}。

方式 1:启动 DSH 前导出
export GITHUB_TOKEN=ghp_...

权限要求:

| token 类型 | 需要的权限 |
| classic | repo(只发公开仓库可用 public_repo) |
| fine-grained | Contents: Read and write;若要让插件自己创建仓库,另需 Administration: Read and write(或账户级 Repository creation) |

⚠️ 注意一个容易误判的坑:仓库 API 返回的 permissions.push=true 反映的是你账号在该仓库的角色,不是这个 token 被授予的权限。判断 token 能否写入,要看 403 响应里的 x-accepted-github-permissions 头。

存储的 token 保存在 DSH 凭据库里,不在 settings.yaml。这一点很重要:凭据库以文件权限 0600 写在写锁之后,而设置字段会把 PAT 以明文留在设置界面会读回的 YAML 文件里。

所有 token 形态在进入日志或对话记录之前都会被遮蔽 —— 包括 git 报错时习惯性回显 remote URL 这种行为。

工具

github_sync

发布当前工作区。

| 参数 | 类型 | 默认值 | 含义 |
| repo | string | 项目文件夹名,经 slug 化 | 仓库名 |
| owner | string | 配置的 owner,其次 token 所属用户 | 仓库所有者 |
| description | string | — | 仅在创建仓库时生效 |
| visibility | private \| public \| internal | 配置值,其次 private | 新仓库的可见性 |
| auto_init | boolean | false | 是否让 GitHub 创建首个提交 |
| commit_message | string | Initial commit,其次 chore: sync workspace | 提交信息 |
| push | boolean | true | 设为 false 则只在本地提交 |
| force | boolean | false | 历史冲突时覆盖远端分支 |
auto_init 默认是 false,这是刻意的。用初始提交创建的仓库,本身已含有一个工作区没有的提交,会让第一次推送就被 non-fast-forward 拒绝。

github_status

报告一次同步会如何执行 —— 仓库名、git 状态、远端、token 来源、git 版本 —— 不改动任何东西。用于预览。它也会带出待处理的 harness 升级提醒(见 保持更新)。

github_configure

向 GitHub API 校验一个 personal access token 并存储。若 classic token 报告的 scope 不含 repo 会被拒绝;它的调用展示中永不回显 token。仅在用户主动提供了 token 时调用;如果用户不愿粘贴,优先用 GITHUB_TOKEN。

设置

github-sync 命名空间保存非敏感默认值,可在 设置 → 插件 中编辑:

| 键 | 默认值 | 含义 |
| owner | 空 | 新仓库的所属账号;空表示 token 自己的用户 |
| visibility | private | 新建仓库的可见性 |
| autoInit | false | 是否让 GitHub 创建首个提交 |
| commitMessage | 空 | 工作区尚无仓库时使用的提交信息 |

配置界面或脚本也可以直接用:

GET /api/github-sync.settings → 默认值、token 状态、git 版本 POST /api/github-sync.token → { "token": "..." } 或 { "clear": true } POST /api/github-sync.verify → 校验已存储或传入的 token

设计取舍

有三个决定值得了解,因为每一个都对应一种具体的失败。

token 永不落盘。 origin 始终保存为干净的 https://github.com//.git,而带认证信息的 URL 只作为单次 git push 的参数传入。因此 token 不会进入 .git/config,不会被之后手动执行的 git push 继承,也无法从仓库里被翻出来。

git 永不弹出提示。 每次 git 调用都带 GIT_TERMINAL_PROMPT=0、GIT_ASKPASS= 和 GCM_INTERACTIVE=never。没有这些,一次认证失败会让 git 在一个托管 harness 里根本不存在的控制台上等待输入密码,调用会一直挂到超时,而不是把失败报出来。

远端分叉是协调,不是覆盖。 当远端分支已有提交时,插件先 fetch 再 rebase,之后才推送;force 始终需要显式开启。rebase 冲突时会用 git rebase --abort 回滚,工作树被留在原样。

另外两个较小的点:

- origin 保存的是仓库身份,不是凭据 —— 因此之后手动 git push 会用用户自己的 git 凭据,这才是应有的行为。
- git 操作不是并发安全的。 github_sync 声明 isConcurrencySafe: false,因为同一工作区里两次 git 会在索引锁上相撞。

保持更新

插件是针对某一个 harness API 面写的。应用更新后,插件引用的包版本、导出或服务可能已不存在 —— 而它的失败形态是整棵插件树完全无法加载。

scripts/watch-dsh-update.mjs 记录 harness 核心版本,一旦变化就往 DSH home 写一条提醒:

node scripts/watch-dsh-update.mjs

DSH updated - plugins may need updating

The DeepSeek Harness core moved from 0.1.5-rc.2 to 0.1.6. Installed
plugins were built against the previous surface and may no longer load.

Send this to the assistant in DSH:

"DSH was updated from 0.1.5-rc.2 to 0.1.6. Check every installed plugin
for compatibility and update the ones that need it."

github_status 会读取这条提醒并并入自己的报告,因此助手可以主动提出,不必等用户自己注意到控制台输出。

把它注册成登录任务即可自动运行。在 Windows 上,放进「启动」文件夹的快捷方式就够了:

$startup = [Environment]::GetFolderPath('Startup')
$target = '/node_modules/dsh-github-sync/scripts/watch-dsh-update.mjs'
$shell = New-Object -ComObject WScript.Shell
$lnk = $shell.CreateShortcut("$startup\DSH GitHub Sync Update Watch.lnk")
$lnk.TargetPath = (Get-Command node).Source
$lnk.Arguments = ""$target" --quiet"
$lnk.WindowStyle = 7 # 最小化
$lnk.Save()

加 --quiet 可在没有变化时不输出。

如果 DSH 完全打不开,问题通常出在插件树上:先用安全模式启动,让助手逐个重新启用插件;或者手动跑一次这个 watcher,把它给出的那段话发给助手。

验证

test/verify.mjs 离线运行 33 项检查:REST 层由 stub fetch 提供,git 层跑在磁盘上真实的 bare 仓库上。这个组合恰好覆盖了生产上真正会出问题的顺序 —— 创建、初始化、提交、推送 —— 同时又完全不依赖外网。

git config --show-origin --get http.sslBackend
schannel -> 由 Windows 证书库负责,git 侧不需要任何 CA 配置

只有当 git 报告的是 OpenSSL 后端时(macOS、Linux 的默认情况,以及部分这样配置的 Windows 构建)才需要给它单独的 bundle —— 而且要指向合并后的 bundle,因为直接替换默认值会破坏所有未被中间人的正常域名: bash
cat "$(git config --get http.sslCABundle 2>/dev/null || echo /etc/ssl/certs/ca-certificates.crt)" \
~/.local/share/dsh-github-sync/certs/accelerator-root.pem > ~/.local/share/dsh-github-sync/certs/combined.crt
git config --global http.sslCAInfo ~/.local/share/dsh-github-sync/certs/combined.crt

许可证

MIT —— 见 LICENSE。
预览分享卡片长什么样 ↓s-huizhuy-u/dsh-github-sync
分享 · DeepSeek Harness Hub
s-huizhuy-u/dsh-github-sync

一句话把工作区建仓提交并推送到 GitHub

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部