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

看板会话运维工具 kira905/dsh-board-toolkit

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

用命令行管理任务卡、归档会话并跨机取数

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

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

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

状态速览

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

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

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

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

可执行外部命令读写/删除本地文件读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 97 处,展示前 63 条)
  • 发起网络请求
    board-card.mjs:67
    const res = await fetch(`${BASE}/api/task-board/action`, {
  • 发起网络请求
    board-card.mjs:76
    const res = await fetch(`${BASE}/api/task-board/state`, { headers: H });
  • 发起网络请求
    board-card-add.mjs:193
    const res = await fetch(`${BASE}/api/task-board/action`, {
  • 发起网络请求
    board-card-add.mjs:223
    const st = await (await fetch(`${BASE}/api/task-board/state`, { headers: H })).json();
  • 发起网络请求
    board-dup-check.mjs:107
    res = await fetch(STATE_URL, { headers: HEADERS, signal: AbortSignal.timeout(TIMEOUT_MS) });
  • 发起网络请求
    board-dup-check.mjs:140
    res = await fetch(`${ARCHIVE_URL}?limit=1`, { headers: HEADERS, signal: AbortSignal.timeout(TIMEOUT_MS) });
  • 发起网络请求
    board-archive-bulk.mjs:95
    const res = await fetch(STATE_URL, { headers: HEADERS_GET, signal: AbortSignal.timeout(TIMEOUT_MS) })
  • 发起网络请求
    board-archive-bulk.mjs:101
    const res = await fetch(ACTION_URL, {
  • 发起网络请求
    board-archive-bulk.mjs:133
    const res = await fetch(`${ARCHIVE_URL}?limit=100&offset=${offset}`, {
  • 发起网络请求
    board-archive-line.mjs:178
    res = await fetch(STATE_URL, { headers: HEADERS_GET, signal: AbortSignal.timeout(TIMEOUT_MS) });
  • 发起网络请求
    board-archive-line.mjs:197
    res = await fetch(ACTION_URL, {
  • 发起网络请求
    board-archive-line.mjs:228
    const res = await fetch(`${BASE}/api/task-board/archive?limit=100&offset=${offset}`, {
  • 发起网络请求
    board-line-backfill.mjs:111
    res = await fetch(STATE_URL, { headers: HEADERS_GET, signal: AbortSignal.timeout(TIMEOUT_MS) });
  • 发起网络请求
    board-line-backfill.mjs:124
    res = await fetch(ACTION_URL, {
  • 发起网络请求
    board-merge.mjs:245
    const res = await fetch(`${BASE}/api/task-board/archive?limit=100&offset=${offset}`, { headers: H });
  • 发起网络请求
    board-merge.mjs:283
    const res = await fetch(`${BASE}/api/task-board/state`, { headers: { ...H, 'x-dsh-board-scope': 'all' } });
  • 发起网络请求
    board-merge.mjs:289
    const res = await fetch(`${BASE}/api/task-board/action`, {
  • 执行外部命令来自配置/变量
    board-merge.mjs:347
    const r = spawnSync(process.execPath, [cli, '--text', text], { encoding: 'utf8', windowsHide: true, timeout: 60000 });
  • 读取本地文件
    archive-card-sessions.mjs:82
    function sha256File(p) { return createHash('sha256').update(readFileSync(p)).digest('hex'); }
  • 读取本地文件
    archive-card-sessions.mjs:84
    let buf; try { buf = readFileSync(file); } catch { return null; }
  • 读取本地文件
    archive-card-sessions.mjs:144
    let buf; try { buf = readFileSync(file); } catch { return []; }
  • 读取本地文件
    archive-card-sessions.mjs:241
    const ledger = JSON.parse(readFileSync(LEDGER, 'utf8'));
  • 读取本地文件
    archive-card-sessions.mjs:272
    if (existsSync(SYNCED_REPO)) {
  • 读取本地文件
    archive-card-sessions.mjs:309
    const st = statSync(currentPath);
  • 写入本地文件
    archive-card-sessions.mjs:355
    mkdirSync(ARCHIVE_ROOT, { recursive: true });
  • 删除本地文件递归
    archive-card-sessions.mjs:399
    rmSync(c.dir, { recursive: true, force: true });
  • 写入本地文件
    archive-card-sessions.mjs:409
    writeFileSync(mf, JSON.stringify({ kind: 'card-sessions-archive', stamp: STAMP, hours: HOURS, moved, entries: manifest }, null, 2), 'utf8');
  • 读取密钥环境变量
    dsh-session-mirror.mjs:117
    const KEY = process.env.DSH_MIRROR_KEY || path.join(HOME, '.ssh', 'id_ed25519_mirror');
  • 执行外部命令来自配置/变量
    dsh-session-mirror.mjs:217
    const r = spawnSync(cmd, args, { encoding: 'utf8', timeout: opts.timeout ?? 600_000, maxBuffer: 64 * 1024 * 1024, windowsHide: true });
  • 读取本地文件
    dsh-session-mirror.mjs:248
    try { txt = fs.readFileSync(file, 'utf8'); } catch { return blocks; }
  • 读取本地文件
    dsh-session-mirror.mjs:363
    const j = JSON.parse(fs.readFileSync(STATE, 'utf8'));
  • 读取本地文件
    dsh-session-mirror.mjs:414
    && fs.existsSync(AUDIT_LEGACY_REPORT_DIR)) dirs.push(AUDIT_LEGACY_REPORT_DIR);
  • 读取本地文件
    dsh-session-mirror.mjs:425
    try { names = fs.readdirSync(dir); } catch { continue; }
  • 读取本地文件
    dsh-session-mirror.mjs:430
    try { j = JSON.parse(fs.readFileSync(p, 'utf8')); } catch { continue; }
  • 读取本地文件
    dsh-session-mirror.mjs:457
    reportMdPath: fs.existsSync(mdPath) ? mdPath : null,
  • 写入本地文件
    dsh-session-mirror.mjs:490
    fs.writeFileSync(tmp, JSON.stringify(obj, null, 2), 'utf8');
  • 写入本地文件
    dsh-session-mirror.mjs:491
    fs.renameSync(tmp, STATE);
  • 写入本地文件
    dsh-session-mirror.mjs:881
    fs.writeFileSync(tmp, text, 'utf8');
  • 写入本地文件
    dsh-session-mirror.mjs:882
    try { fs.renameSync(tmp, file); }
  • 删除本地文件
    dsh-session-mirror.mjs:884
    try { fs.rmSync(file, { force: true }); } catch { }
  • 写入本地文件
    dsh-session-mirror.mjs:885
    fs.renameSync(tmp, file);
  • 删除本地文件
    dsh-session-mirror.mjs:1033
    if (recursive) fs.rmSync(target, { recursive: true, force: true });
  • 删除本地文件
    dsh-session-mirror.mjs:1034
    else fs.rmSync(target, { force: true });
  • 写入本地文件
    dsh-session-mirror.mjs:1044
    fs.mkdirSync(localTmp, { recursive: true });
  • 发起网络请求
    board-ops/board-status.mjs:30
    const res = await fetch(`${BASE}/api/task-board/state`, { headers: H });
  • 发起网络请求
    board-ops/card-action.mjs:53
    const res = await fetch(`${BASE}/api/task-board/action`, {
  • 发起网络请求
    board-ops/card-note.mjs:39
    const res = await fetch(`${BASE}/api/task-board/state`, { headers: H });
  • 发起网络请求
    board-ops/card-note.mjs:51
    const r = await fetch(`${BASE}/api/task-board/action`, {
  • 发起网络请求
    board-ops/card-prompt.mjs:48
    const res = await fetch(`${BASE}/api/task-board/state`, { headers: H });
  • 发起网络请求
    board-ops/card-run.mjs:41
    const res = await fetch(`${BASE}/api/task-board/action`, {
  • 发起网络请求
    board-ops/card-state.mjs:31
    const res = await fetch(`${BASE}/api/task-board/state`, { headers: H });
  • 发起网络请求
    board-ops/panel-fetch.mjs:283
    const res = await fetch(url, { redirect: 'manual', signal: AbortSignal.timeout(timeoutMs), headers: { accept: 'text/html' } });
  • 发起网络请求
    board-ops/panel-fetch.mjs:312
    const res = await fetch(base + ep.path, { headers, signal: AbortSignal.timeout(timeoutMs) });
  • 发起网络请求
    board-tools/board-act.mjs:44
    const st = await (await fetch(`${BASE}/api/task-board/state`, { headers: H })).json();
  • 发起网络请求
    board-tools/board-act.mjs:58
    const res = await fetch(`${BASE}/api/task-board/action`, {
  • 发起网络请求
    board-tools/board-card-dump.mjs:23
    const st = await (await fetch(`${BASE}/api/task-board/state`, { headers: H })).json();
  • 发起网络请求
    board-tools/board-card-status.mjs:89
    const st = await (await fetch(`${BASE}/api/task-board/state`, { headers: H })).json();
  • 发起网络请求
    board-tools/board-status-brief.mjs:20
    const res = await fetch(`${BASE}/api/task-board/state`, { headers: H });
  • 读取密钥环境变量
    lib/dsh-rpc-client.mjs:195
    const env = process.env.DSH_RPC_COOKIE_SECRET;
  • 执行外部命令来自配置/变量
    lib/peer-channel.mjs:150
    const r = spawnSync(process.execPath, [cli, sub, '--json'], {
  • 执行外部命令来自配置/变量
    lib/deploy-guard.mjs:266
    return spawnSync(process.execPath, ['--input-type=module'], {
  • 执行外部命令来自配置/变量
    lib/deploy-guard.mjs:280
    return spawnSync(process.execPath, ['--input-type=module'], {
  • 执行外部命令来自配置/变量
    board-ops/_test/test-session-tail-v3.mjs:70
    const r = spawnSync(process.execPath, [CLI, ...args, '--home', HOME], { encoding: 'utf8', timeout: 60_000, windowsHide: true });
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

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

看板与会话运维的 30 件零依赖命令行工具:任务卡、会话归档与索引、跨机取数。

README

由 DeepSeek 最新模型翻译生成
dsh-board-toolkit · DSH 看板与会话运维工具集 这是什么看板与会话运维的 30 件零依赖命令行工具:任务卡、会话归档与索引、跨机取数 —— 一件一个小脚本,node 能跑就够。 它解决什么任务看板一旦「自己维护自己」,卡就不是纸片了,而是一次真实的智能体会话:谁在跑、跑完该谁验收、失败怎么打回、归档后去哪查。这些操作如果靠人手改 JSON 账本,迟早写坏。所以全部走宿主 HTTP 接口,账本一律由宿主权威持有。 一条命令跑起来 npm i -g @kira905/dsh-board-toolkit board-card status --line "某条主线" # 只读:整条主线的卡况 + 执行会话是否还在跑 先看它长什么样(真实输出)用法 board-card <status|run|confirm|reject|move> <cardId> [选项] 看板卡操作:查状态 / 执行 / 验收 / 打回 / 移列。一律走宿主 HTTP 接口,绝不手改看板账本文件。 30 个入口的完整清单见下方「里面有什么」。 本仓是命令行工具,不挂宿主界面,不需要 dsh.bundle、不需要写 cordis.patch.yml。
展开完整文档(README 剩余 1 节)
dsh-board-toolkit · DSH 看板与会话运维工具集

这是什么看板与会话运维的 30 件零依赖命令行工具:任务卡、会话归档与索引、跨机取数 —— 一件一个小脚本,node 能跑就够。

它解决什么任务看板一旦「自己维护自己」,卡就不是纸片了,而是一次真实的智能体会话:谁在跑、跑完该谁验收、失败怎么打回、归档后去哪查。这些操作如果靠人手改 JSON 账本,迟早写坏。所以全部走宿主 HTTP 接口,账本一律由宿主权威持有。

一条命令跑起来
npm i -g @kira905/dsh-board-toolkit
board-card status --line "某条主线" # 只读:整条主线的卡况 + 执行会话是否还在跑

先看它长什么样(真实输出)用法 board-card <status|run|confirm|reject|move> <cardId> [选项]

看板卡操作:查状态 / 执行 / 验收 / 打回 / 移列。一律走宿主 HTTP 接口,绝不手改看板账本文件。

30 个入口的完整清单见下方「里面有什么」。

本仓是命令行工具,不挂宿主界面,不需要 dsh.bundle、不需要写 cordis.patch.yml。 装它 = npm i -g @kira905/dsh-board-toolkit(或 npx -p @kira905/dsh-board-toolkit board-status)。装进配置档也对,但那条 declares no dsh.bundle 警告是正常现象,不是故障。

装完自检(三条只读验法)

<profile> 换成你实际用的配置档(默认 web),<数据根> 换成你的 DSH 数据根(默认 ~/.dsh)。

① 组合树里有没有它(只读、约 0.6 秒、不启服务)
dsh --profile <profile> --dump-config | Select-String "dsh-board-toolkit"
期望:bundle 层出现一行 "# == <登记名>"、insert 层出现 "- id: <entry>"(问的都是「它挂上没」);本仓包名 @kira905/dsh-board-toolkit —— 带 scope 装的写带 scope 名、老工装 / 手写的可能是裸名,两种都搜一遍 ⚠️ 若该包会 insert 一行,还要数一遍"同一个 id 出现了几次",必须 == 1

② 组合列表里有没有它(只读) Get-Content <数据根>/profiles/<profile>/package.json | Select-String "@kira905/dsh-board-toolkit" 期望:dependencies 与 dsh.profile.bundles 两处都有(CLI 类只需要 dependencies;bundles 里也可能写裸名 dsh-board-toolkit)

③ 命令在不在 —— 【只查存在,不执行】 Test-Path <数据根>/profiles/<profile>/node_modules/.bin/board-status.CMD # 装进 profile 的 Test-Path "$env:APPDATA\npm\board-status.CMD" # npm i -g 装的期望:True。两条路径按你实际用的装法挑一条

探针只做存在性检查(只看命令文件在不在,不执行任何命令)。
要不要用 --help 验,见本仓当前说明与该命令的参数表。

三十个零依赖命令行小件:看板卡(建卡 / 查重 / 起卡 / 验收 / 归档 / 并回 / 快照 / 趋势)、会话(按卡归档、索引导出与元数据回填、索引缓存瘦身与恢复)、会话异地镜像。
全部走宿主 HTTP API 或只读文件,批量写操作默认 dry-run,真写必须显式 --apply。

这是什么 · 给谁用

DSH(DeepSeek Harness)把「任务卡」做成了真会话:一张卡 = 一条待办 + 一次独立执行。
本仓库把这些日常动作做成可以脚本化、可以进 CI、可以被另一个智能体调用的命令行件:

- 人:想看板面之外的东西(趋势、归一化率、归档前后一致性);
- 脚本 / 智能体:想在一个无人值守的夜里批量归档、批量回填、批量并回,并且每一步都能回滚;
- 排障:想在一分钟内回答「这张卡为什么卡住了」「这个会话到底是死是活」「归档端点为什么 403」。

设计前提:账本是宿主(Host)的,不是脚本的。所有写动作要么走 Host API,要么在本地文件上做「备份 → 改 → 校验 → 可回滚」三段式。

同源说明

本仓部分文件与一套内部生产实现同源(同一份工程长期演进下来的两处落点)。

- 同源程度:按行级同源度口径统计(同名可比件里,仓内文件的非空行有多少能在参照件中找到,多重集扣减),本仓「≥50% 行同占比」= 100%。
- 这意味着:本仓是那套实现的提炼导出 —— 既不是逐字副本,也不是完全重写的独立实现。拿单个文件当"独立参考实现"读之前,请先跑下面的判据。
- 怎么复跑:同源度扫描器见 dsh-quality-toolkit 的 dsh-sim-scan.mjs(--repo <本仓> --prod-root <参照根>);分档阈值与口径写在它的 config/sim-scan.json 里,不藏在代码里。
- 许可:本仓许可见仓根 LICENSE(有子树例外时以子树 LICENSE 为准)。

零依赖 · 怎么跑

需要 Node.js ≥ 22(用到 AbortSignal.timeout、多帧 zstd 解压等)。没有第三方依赖,不需要 npm install 之前的网络。

git clone https://github.com/kira905/dsh-board-toolkit.git
cd dsh-board-toolkit
node board-card.mjs status --line "主线名"

安装成全局命令(可选,会得到 board-status / board-card-run 等短名):

npm install -g @kira905/dsh-board-toolkit
board-status <cardId>

也可以直接 npx -p @kira905/dsh-board-toolkit board-dup-check --kw 归档。

ℹ️ 帮助与参数闸(2026-10-30 起):board-card · board-card-add · board-merge · board-snapshot-export · archive-card-sessions · archive-index-export · projcache-prune · board-act · board-card-dump · board-card-check · board-brief · board-selfdev-ratio · board-upstream-symbol-gate 这 13 件已支持 --help(打印用法、退出码 0)与未知参数拒收(退出码 2,绝不继续执行)。用法文本会写清「这个命令会写什么」与退出码。

其余历史脚本(board-ops/ 下的小工具、archive-meta-backfill、dsh-session-mirror、projcache-restore)仍是旧行为:未识别的参数被忽略、脚本直接执行 —— 对它们请照下面每件用途表给的参数调用,不要用 --help 试探。

环境变量

| 变量 | 作用 | 默认 |
| DSH_WORKSPACE | 工作区根(放 docs/ tools/ _archive/ logs/ 的那棵树) | ~/DSH |
| DSH_HOME | 宿主 home(放 sessions/、task-board/ledger-v2.json 等) | ~/.dsh |
| DSH_WEB_URL / DSH_BOARD_BASE / DSH_BOARD_URL | 宿主 HTTP 地址 | http://localhost:3080 |
| DSH_MIRROR_HOST / DSH_MIRROR_ROOT | 异地镜像的目标主机与镜像根 | mirror@example-host / ~/dsh-session-mirror/local/.dsh |
| DSH_OFFSYNC_ROOT / SYNCED_SESSIONS_REPO | 跨机同步根 / 仓2 会话落地区 | 同步根缺省取 <workspace 同级> 下的约定目录名(两变量任一显式给出即覆盖) |
| DSH_WORKSPACE_ID | 建卡时用的工作区 id(board-card-add 的 --ws 缺省值) | 空(不设即由宿主决定落到哪个工作区) |
| BOARD_UPSTREAM_SRC / BOARD_PLUGIN_SRC | 上游看板包 src 与本地看板插件 src(两个比对类工具必需) | 无(不设则报错退出 2) |
| PROJCACHE_PRUNE_SNAPSHOT | projcache-restore 的默认来源快照 | 无(须 --from) |

本发行版不内置任何机器专属路径;拿不到配置时宁可报错退出,也不静默落到某个磁盘。

目录结构

.
├── board-.mjs 看板 11 件(根目录,见下表) ├── archive-.mjs 归档 3 件 ├── projcache-.mjs 会话索引缓存 2 件 ├── dsh-session-mirror.mjs 会话异地镜像 1 件 ├── board-ops/ 盯卡运维 9 件(含一份子 README) ├── board-tools/ 只读/写动作 4 件(含一份子 README) └── lib/ 依赖闭包(RPC 客户端、归档视图、生产闸、zstd 帧、主机短码…)

逐件用途表

看板(根目录 11 件)

| 文件 | 一行用途 | 典型用法 |
| board-card.mjs | 单卡操作:查状态 / 起卡 / 验收 / 打回 / 移列 | node board-card.mjs status --line "主线名" |
| board-card-add.mjs | 建卡(内置 DoR 模板与字段校验) | node board-card-add.mjs --title "…" --prompt p.md |
| board-dup-check.mjs | 建卡前查重(扫全量,含归档卡) | node board-dup-check.mjs --kw 归档 --deep |
| board-archive-bulk.mjs | 批量归档已完成的卡(可生成回滚脚本) | node board-archive-bulk.mjs --apply --emit-restore |
| board-archive-line.mjs | 按主线整条归档(可生成逐卡回滚脚本 + 桌面入口) | node board-archive-line.mjs --line "…" --apply |
| board-line-backfill.mjs | 批量回填卡的主线 / 节点字段(映射文件驱动) | node board-line-backfill.mjs --map map.json --apply |
| board-merge.mjs | 把异地快照并回本机账本(含 line/seq 合法性门) | node board-merge.mjs --snapshot snap.json --dry-run |
| board-snapshot-export.mjs | 导出看板快照(含主机名与时间戳,另带敏感串自检) | node board-snapshot-export.mjs --label depart |
| board-j1b-trend.mjs | 复算看板体量趋势判据(斜率 / 阈值告警) | node board-j1b-trend.mjs --days 30 |
| board-selfdev-ratio.mjs | 量化「自研程度」:与上游看板包逐行比对 | BOARD_UPSTREAM_SRC=… BOARD_PLUGIN_SRC=… node board-selfdev-ratio.mjs |
| board-upstream-symbol-gate.mjs | 符号门:上游独有的 import 在宿主主包闭包里是否真能解析 | node board-upstream-symbol-gate.mjs |

归档与索引(5 件)

| 文件 | 一行用途 | 典型用法 |
| archive-card-sessions.mjs | 把「看板卡触发的执行会话」里超过 N 小时不活跃的搬进归档区 | node archive-card-sessions.mjs --hours=24 |
| archive-index-export.mjs | 导出归档区索引(按主机短码落 JSON) | node archive-index-export.mjs --top 20 |
| archive-meta-backfill.mjs | 归档元数据回填:库表 ↔ 归档目录对账(孤儿 / 缺档) | node archive-meta-backfill.mjs --dry-run |
| projcache-prune.mjs | 会话索引缓存瘦身(先备份、后裁剪、可回滚) | node projcache-prune.mjs --dry-run |
| projcache-restore-archived.mjs | 从历史备份里把「已归档会话」的记录合并回来 | node projcache-restore-archived.mjs --from snap.before |

会话异地镜像(1 件)

| 文件 | 一行用途 | 典型用法 |
| dsh-session-mirror.mjs | 会话与附件增量镜像到对端主机(只增不删、带空壳守卫与远端盘告警) | node dsh-session-mirror.mjs --dry-run(默认即 dry-run) |

board-ops/ · 盯卡运维 9 件

| 文件 | 一行用途 |
| board-ops/board-status.mjs | 看板总览(在板 / 归档 / 状态分布 / 主线分组) |
| board-ops/panel-fetch.mjs | 面板与归档端点取证:三组对照(裸 / 只带同源栅栏头 / 带 cookie),给状态码 · 字段名 · 体积 · 耗时 |
| board-ops/card-state.mjs | 单卡状态 + 执行记录 + 交付报告 |
| board-ops/card-prompt.mjs | 打印单卡的 title / status / description / prompt(只读) |
| board-ops/card-run.mjs | 起卡(run / rerun),--apply 才真执行 |
| board-ops/card-action.mjs | confirm / reject / move / archive / restore / delete,--apply 才真写 |
| board-ops/card-note.mjs | 往卡 description 追加留痕(幂等) |
| board-ops/session-state.mjs | 会话存活判据(防「假结算」)/ 找在跑的会话 |
| board-ops/session-tail.mjs | 读会话 jsonl.zstd 尾部(多帧解压;排障用) |
| board-ops/_test/test-session-tail-v3.mjs | session-tail 的 v3 文件名世代自测(退出码 0 = 全绿) |

board-tools/ · 短小四件

| 文件 | 一行用途 |
| board-tools/board-status-brief.mjs | 极简总览:现役主线 + 全部非 done 在途卡 |
| board-tools/board-card-status.mjs | 单卡速查(status + 末两条执行 + 执行会话是否在跑) |
| board-tools/board-card-dump.mjs | dump 卡的 title / description / prompt 全文 |
| board-tools/board-act.mjs | 写动作 run / confirm / reject / move(--card 建议给完整 uuid) |

lib/ · 依赖闭包(不单独发命令,但可 import)

dsh-rpc-client(宿主 HTTP RPC 客户端,端点表 + 新旧双栈回落)、dsh-home / workspace(home 与工作区根解析)、archive-meta-store / projcache-read / session-file-name / zstd-frames(归档与索引读取)、board-archive-view / board-j1-limits(看板判据)、production-guard / deploy-guard / bypass-ledger(生产路径闸与放行台账)、redact(敏感串脱敏)、host-tag(主机短码)、peer-channel / remote-space / sync-topology / shell-session-watch / watch-events / pitfall-(镜像与跨机同步)。

与 DSH 的集成点

| 集成点 | 走什么 | 说明 |
| 看板读写 | POST/GET /api/task-board/ | 账本 ledger-v2.json 归宿主所有,脚本永不直接改它 |
| 宿主 RPC | /api/<ns>/<method>(lib/dsh-rpc-client.mjs) | cookie 三路注入:显式参数 / DSH_RPC_COOKIE_SECRET / 宿主本机凭据件(公开环境不存在 ⇒ 无凭据,不静默改变行为) |
| 会话文件 | <DSH_HOME>/sessions/(session.v3.jsonl.zstd) | 文件名由 lib/session-file-name.mjs 统一解析,不写死世代名* |
| 归档区 | <DSH_HOME>/_archived-sessions/** | 卡会话在 cards/<批次>/、主线在 <批次>/,两层都要扫 |
| 回滚点 | <DSH_WORKSPACE>/_archive/<任务>-<时间戳>/ | 写动作 --emit-restore 会生成 before.json + 逐卡恢复脚本 + 桌面 .cmd |

安全边界(重要)

1. 默认 dry-run:所有批量写操作(归档 / 回填 / 起卡 / 验收 / 删卡)不传 --apply 只打印计划。
2. 生产路径闸:lib/production-guard.mjs 对「生产树」做逻辑路径 + realpath 双侧判定(junction 场景下只判一边必然失效)。
3. 只读优先:board-status / card-state / session-tail / panel-fetch / board-j1b-trend --no-sample 等只读;自检(--self-test / --selftest)不读也不写生产账本。
4. 不删除历史:镜像与归档都「只增不删」;本机删除面集中在 %TEMP% 与显式 --apply 的归档动作。
5. 凭据:本仓库不含任何凭据读取件(宿主专有的凭据解析件不随仓发布)。需要鉴权的调用由环境变量或调用方显式注入。

版本与许可

- 版本:CHANGELOG.md;当前 v0.1.0(首批拆仓)。
- 许可:AGPL-3.0 + 商业授权(双许可)——要么按 AGPL-3.0 使用并开源你的衍生作品,要么购买商业授权。详见 LICENSE 与下方「License / 商业授权」段。
- 上游:DSH(DeepSeek Harness)本身另有其许可,本仓库只包含自研的命令行件。

License / 商业授权

This project is dual-licensed.

1. Open source: GNU Affero General Public License v3.0 (see LICENSE).
You may use, modify and distribute this software under AGPL-3.0, provided that
derivative works are also released under AGPL-3.0 (including when offered over a network).

2. Commercial license: If you want to use this software in a closed-source product,
or you cannot comply with AGPL-3.0, a commercial license is available.
Contact the author to obtain one.

本项目采用双许可:开源使用请遵循 LICENSE 中的 AGPL-3.0(衍生作品需同样开源,含网络提供服务的情形);如需闭源商用或不适用 AGPL-3.0,请联系作者取得商业授权。
预览分享卡片长什么样 ↓kira905/dsh-board-toolkit
分享 · DeepSeek Harness Hub
kira905/dsh-board-toolkit

用命令行管理任务卡、归档会话并跨机取数

这是你的仓库?认领条目

回到顶部